2016-09-15 4 views
1

Ich bekomme Fehler beim Speichern in der Tabelle, aber der On Error wird nicht ausgelöst. Auf der Zeile db.Execute erhalte ich einen Constraint-Fehler, aber anstatt einen Fehler auszulösen, wird der Code so fortgesetzt, als wäre er erfolgreich. Wenn ich aus der Routine austrete, weiß ich, dass ein Fehler vorliegt, weil 0 zurückgegeben wird, aber ich weiß nicht, was der Fehler ist, also muss ich am Ende mit dem Debuggen reinkommen, den Code erfassen und dann direkt versuchen Zugriff. Kann ich es irgendwie schaffen, den Fehler auszulösen? Hier ist mein Code (kurz):Zugriff VBA-Fehler beim Speichern in Tabelle nicht "On Error"

Private Function storeHAP(list of arguments, ByRef db As DAO.Database) As Long 
    Dim sql As String 
    On Error GoTo foundError 

    sql = "INSERT INTO HAPs (list of column names...) " + _ 
      "VALUES (list of values...)" 
    db.Execute (sql) 

    'This function will look up the record and return the primary key. 
    'A value of 0 indicates it wasn't stored and will force an exit in 
    'the main routine. 
    storeHAP = lookupHAP(list of arguments..., db) 
    Exit Function 
foundError: 
    MsgBox "Error in storeHAP: " + CStr(Err) + ", " + Error(Err) + ". SQL: " + sql + "." 
End Function 'storeHAP 
+1

Wie wissen Sie, es gibt eine Einschränkung Fehler entdeckt? Ist es kaputt, wenn Sie "db.Execute" foo "'? Unrelated, aber 1) lassen Sie die Klammern um '(sql)' fallen, und 2) Sie könnten nützlich finden, dass das globale 'Err'-Objekt' Number'- und 'Description'-Eigenschaften hat; die Verwendung von ihnen würde den "foundError" -Code viel weniger verwirrend machen, gegeben "Error" verwendet als eine Anweisung ist eine veraltete Möglichkeit, einen Fehler zu verursachen, und "Error" als Funktion (wie Sie haben) ist eine Umgehung der Abrufen der Beschreibung für 'Err.Number', was Sie ihm tatsächlich geben (' Nummer' ist die * Standard-Eigenschaft * des 'Err'-Objekts). –

+2

Wenn ich debuggen gehe und einen print sql im unmittelbaren Fenster mache und dann sql in ein Access-Abfrage-Design kopiere, bekomme ich einen Constraint-Fehler, aber es reicht nicht aus, mich wissen zu lassen, wo. Es stellt sich heraus, dass ich, wenn ich der Antwort unten folge, tatsächlich genug Informationen in meiner MsgBox erhalte, um genau festzustellen, wo es passiert. – PKatona

Antwort

1

Von the documentation (Hervorhebung von mir):

In einem Microsoft Access-Arbeitsbereich, wenn Sie eine syntaktisch korrekte SQL-Anweisung zur Verfügung stellen und die entsprechenden Berechtigungen, die Execute-Methode wird nicht scheitern - auch wenn sie nicht eine einzelne Zeile kann geändert werden oder gelöscht. Verwenden Sie daher immer die Option dbFailOnError, wenn Sie die Methode Execute zum Ausführen einer Aktualisierungs- oder Löschabfrage verwenden, indem Sie verwenden. Diese Option generiert einen Laufzeitfehler und setzt alle erfolgreichen Änderungen zurück, wenn alle betroffenen Datensätze gesperrt sind und nicht aktualisiert oder gelöscht werden können.

Sie müssen die dbFailOnError Option angeben:

db.Execute sql, dbFailOnError 
+0

Danke, ich wünschte, die Beispiele, die ich in der Vergangenheit bearbeitet habe, hätten das gezeigt. Ich werde pauschale Updates meiner Systeme machen, um dies zu haben. Ich bin mir ziemlich sicher, dass meine Sachen idiotensicher sind, aber das ist nur gut genug, bis der nächste Idiot kommt! :-) – PKatona

Verwandte Themen