ADO, SQL Server, Retry-Loops



  • Nachdem Transaktionen ja auf Grund von "flüchtigen" Fehlern wie Konflikten/Timeouts fehlschlagen können, macht es Sinn an gewissen Stellen Retry-Loops einzubauen.

    Frage: kann ich irgendwie einfach herausbekommen ob ein Fehler "transient" oder "permanent" ist? Also ob z.B. nur ein Timeout/Konflikt vorliegt, oder ob irgendwas mit dem SQL Statement nicht passt, also irgendwas was sich nicht von selbst "reparieren" wird.



  • Vermutlich bist Du da schon selber drauf gekommen:
    Ist das SQL Stmt syntaktisch falsch wird ein Fehler mit der Nummer 3075 erzeugt. (Siehe err.number)
    Gebe ich zB einen falschen Tabellennamen an wird 3078 erzeugt. Dieser Fehler ist flüchtig, da die Tabelle ja zu einem späteren Zeitpunkt vorhanden sein kann.
    Ist die Tabelle gerade gesperrt bekomme ich den 3008 Fehler. Also temporärer Fehler.

    Hier mein Testcode:

    Public Sub ExecuteSQL()
        Dim oRs As Recordset
    
        On Error GoTo errHandler
        DBEngine.Workspaces(0).BeginTrans
        'Set oRs = DBEngine(0).Databases(0).OpenRecordset("CREATE TABLE BERGu (KName VARCHAR(40) NOT NULL);", , dbFailOnError)
        Call CurrentDb.Execute("CREATE TABLE BERG (KName VARCHAR(40) NOT NULL);", dbFailOnError)
        DBEngine.Workspaces(0).CommitTrans
        Exit Sub
    
    errHandler:
        MsgBox Err.Number
        Resume
    End Sub
    

Anmelden zum Antworten