Currentdb.Execute con dbFailonError no arroja un error

Oct 06 2020

En Access 2003-2016, estoy usando CurrentDb.Execute con dbFailonError para ejecutar una instrucción INSERT. La instrucción INSERT debería fallar (y lo hace) porque un campo tiene un valor incorrecto basado en una tabla relacionada con "Integridad referencial impuesta". Sin embargo, no arroja ningún error. Intenté recrear este problema en una nueva base de datos y el error funciona correctamente. Hay algo mal en la configuración de mi base de datos actual y no quiero volver a crearlo desde cero. He sacado todo de mi base de datos, excepto la pieza problemática, y mi base de datos de ejemplo reproducible mínima está en este enlace .

Aquí está mi código, pero el problema es que este código funciona bien y arroja errores cuando creo una nueva base de datos desde cero. Simplemente no funciona en mi base de datos actual.

Private Sub Command34_Click()
    Dim testsql As String

    testsql = "INSERT INTO tblObservations (Site,TotalDepth) VALUES ('SUD-096',5)"
    With CurrentDb
        On Error GoTo Err_Execute
        .Execute testsql, dbFailOnError
        On Error GoTo 0
        MsgBox ("Upload completed.  " & .RecordsAffected & " records added.")
    End With
    Exit Sub
    
Finish:
    Exit Sub
    
Err_Execute:
    If DBEngine.Errors.Count > 0 Then
        For Each errLoop In DBEngine.Errors
            MsgBox ("Error number: " & errLoop.Number & vbCr & errLoop.Description)
        Next errLoop
    End If
    Resume Finish

End Sub

Respuestas

1 ErikA Oct 06 2020 at 16:31

Úselo Option Explicit, como dijo Hans. ¡Úsalo siempre Option Explicit!

Falta una referencia al objeto de motor de base de datos de Microsoft Office ##. # Access. Aquí es donde dbFailOnErrorse define. Porque no tienes esa referencia, dbFailOnErrorno está definida. Esta referencia se agrega a todas las bases de datos de Access de forma predeterminada y recomiendo encarecidamente agregarla.

Y debido a que no está usando Option Explicit, a VBA no le importa que esté indefinido y simplemente arroje esa variable indefinida a cero.

Si, por alguna razón, no desea agregar la referencia, use el valor correspondiente para dbFailOnError:

.Execute testsql, 128