Currentdb.Execute mit dbFailonError, der keinen Fehler auslöst

Oct 06 2020

In Access 2003-2016 verwende ich CurrentDb.Execute mit dbFailonError, um eine INSERT-Anweisung auszuführen. Die INSERT-Anweisung sollte fehlschlagen (und das tut sie auch), da ein Feld einen falschen Wert hat, der auf einer verwandten Tabelle mit "Enforced Referential Integrity" basiert. Es wird jedoch kein Fehler ausgegeben. Ich habe versucht, dieses Problem in einer neuen Datenbank neu zu erstellen, und der Fehler funktioniert ordnungsgemäß. In den Einstellungen meiner aktuellen Datenbank stimmt etwas nicht, und ich möchte sie nicht von Grund auf neu erstellen. Ich habe bis auf das problematische Teil alles aus meiner Datenbank entfernt, und meine minimal reproduzierbare Beispieldatenbank befindet sich unter diesem Link .

Hier ist mein Code, aber das Problem ist, dass dieser Code einwandfrei funktioniert und Fehler auslöst, wenn ich eine neue Datenbank von Grund auf neu erstelle. In meiner aktuellen Datenbank funktioniert das einfach nicht.

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

Antworten

1 ErikA Oct 06 2020 at 16:31

Verwenden Sie Option Explicit, wie Hans sagte. Immer benutzen Option Explicit!

Ihnen fehlt ein Verweis auf das Microsoft Office ##. # Access Database Engine-Objekt. Hier dbFailOnErrorwird definiert. Da Sie diese Referenz nicht haben, dbFailOnErrorist sie nicht definiert. Diese Referenz wird standardmäßig allen Access-Datenbanken hinzugefügt, und ich empfehle dringend, sie hinzuzufügen.

Und weil Sie nicht verwenden Option Explicit, macht es VBA nichts aus, dass es undefiniert ist, und setzt diese undefinierte Variable einfach auf Null.

Wenn Sie die Referenz aus irgendeinem Grund nicht hinzufügen möchten, verwenden Sie den entsprechenden Wert für dbFailOnError:

.Execute testsql, 128