Currentdb.Execute with dbFailonError não gera um erro

Oct 06 2020

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

1 ErikA Oct 06 2020 at 16:31

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