Beitrag aus SmartTools Access Weekly
Zugriff auf Tabellen effektiv debuggen, Teil 2
Access 365 2024 2021 2019 2016 2013 2010
Wenn Sie in Ihren Datenbanken VBA-Routinen mit Zugriff auf Tabellen entwickeln, treten regelmäßig Fehler mit kryptischen Fehlernummern und wenig hilfreichen Hinweistexten auf. Lesen Sie in diesem Tipp, wie Sie in diesen Fällen dem Fehler schneller auf die Schliche kommen können. Im ersten Teil hatten wir erläutert, dass Access Fehler aus unteren Schichten (ODBC-Treiber, SQL Server) nicht einfach ignoriert, sondern sie lediglich nicht über das "Err"-Objekt anzeigt. Festgehalten werden die Fehler dennoch in einer Auflistung "Errors" des Objektes "DBEngine" (DAO) oder "Connection" (ADO).
Dabei geht Access so vor, dass für jeden Fehler ein Error-Objekt in die Auflistung "Errors" aufgenommen wird. Das letzte Error-Objekt ist Basis des Access-Laufzeitfehlers, die davor liegenden Error-Objekte beinhalten Informationen beispielsweise der Jet-Engine, der Database Engine, des ODBC-Treibers oder einer SQL-Komponente und zwar in der Reihenfolge, in der sie für den jeweiligen Datenzugriff angesprochen werden. Für die Auswertung hatten wir die Prozedur "ListErrors" für den Einsatz mit Datenzugriffen per DAO vorgestellt.
Die folgende Prozedur hilft Ihnen nun, diese Fehlerhistorie bei Datenzugriffen per ADO übersichtlich auszugeben. Kopieren Sie sie zunächst in ein neues oder vorhandenes Modul Ihres VBA-Projektes und richten Sie einen Verweis auf mindestens "Microsoft ActiveX Data Objects 2.8 Library" ein:
Sub ListErrors(blnMsg As Boolean)
Dim objErr As Error
Dim strDebug As String
Dim strMsg As String
On Error Resume Next
If CurrentProject.Connection.Errors.Count = 0 Then
Debug.Print "Keine Fehler protokolliert..."
Else
For Each objErr In CurrentProject.Connection.Errors
With objErr
strDebug = "Fehler: " & _
CStr(.Number) & vbCrLf & _
"Ursache: " & _
.Description & vbCrLf & _
"Quelle: " & _
.Source & vbCrLf
strMsg = strDebug & strMsg
End With
Debug.Print strDebug
Next objErr
If blnMsg Then MsgBox strMsg
End If
End Sub
Die Prozedur arbeitet im Großen und Ganzen wie "ListErrors" für DAO, mit dem Unterschied, dass die "Errors"-Auflistung hier statt an "DBEngine" an "CurrentProject.Connection" gebunden ist. Sie schreibt die Fehlerhistorie in das Direktfenster der VBA-Entwicklungsumgebung und zeigt sie wahlweise abschließend über "MsgBox" als Zusammenfassung an. Ausgegeben werden jeweils die Fehlernummer, die Klartextmeldung der jeweiligen Komponente sowie die Bezeichnung der Quelle, die den Fehler gemeldet hat. In Ihrer Datenbank setzen Sie "ListErrors" dann beispielsweise folgendermaßen ein:
On Error Resume Next
.....
Dim rs As New ADODB.Recordset
rs.Open "SELECT * FROM VerknüpfteTabelle", _
CurrentProject.AccessConnection
If Err <> 0 Then
ListErrors True
Exit Sub
End If
.....
Mit dem Parameter "blnMsg" steuern Sie wieder, ob "ListErrors" eine Zusammenfassung per "MsgBox" anzeigen soll (= True) oder nicht (= False) und die Informationen somit nur im Direktbereich ausgegeben werden.