Currentdb.Execute mit dbFailonError, der keinen Fehler auslöst
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
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