Currentdb.Execute con dbFailonError no arroja un error
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
Ú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