Currentdb.Execute with dbFailonError não gera um erro
No Access 2003-2016, estou usando CurrentDb.Execute com dbFailonError para executar uma instrução INSERT. A instrução INSERT deve falhar (e falha) porque um campo tem um valor incorreto com base em uma tabela relacionada com "Integridade referencial imposta". No entanto, isso não gera um erro. Tentei recriar esse problema em um novo banco de dados e o erro funciona corretamente. Há algo errado nas configurações do meu banco de dados atual e não quero recriá-lo do zero. Retirei tudo do meu banco de dados, exceto a parte problemática, e meu banco de dados de exemplo reproduzível mínimo está neste link .
Aqui está meu código, mas o problema é que esse código funciona bem e emite erros quando crio um novo banco de dados do zero. Simplesmente não funciona em meu banco de dados atual.
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
Respostas
Use Option Explicit, como Hans disse. Sempre use Option Explicit!
Está faltando uma referência ao objeto Microsoft Office ##. # Access Database Engine. É aqui que dbFailOnErrorestá definido. Porque você não tem essa referência, dbFailOnErrornão está definido. Esta referência é adicionada a todos os bancos de dados do Access por padrão, e eu recomendo fortemente adicioná-la.
E porque você não está usando Option Explicit, o VBA não se importa que seja indefinido e apenas converte essa variável indefinida em zero.
Se, por algum motivo, você não quiser adicionar a referência, use o valor correspondente para dbFailOnError:
.Execute testsql, 128