Das Lesen einer verknüpften ODBC-Tabelle kehrt nie zurück
Umgebung
Eigener VBA-Code, der verknüpfte ODBC- oder OData-Tabellen mit DAO Recordset.GetRows liest, in jeder
Access-Version, mit dem Microsoft ODBC Driver 18 for SQL Server oder dem Wkl-OData-Treiber; andere Treiber werden
nicht unterstützt.
Ursache
Scheitert die Quelle mitten in einem Ergebnis – eine Zeile, die der Server nicht berechnen kann, ein Datendienst, der
mit 429 (zu viele Anforderungen) antwortet, eine abgebrochene Verbindung –, kehrt GetRows nie zurück: DAO ruft
SQLFreeStmt des Treibers in einer Schleife auf einem Thread mit 100 % CPU-Last auf, und Access hängt, bis es
beendet wird. MoveNext über dieselben Datensätze löst stattdessen den Fehler 3146 („ODBC-Aufruf fehlgeschlagen“)
aus.
Die WKL-Steuerelemente lesen mit MoveNext und zeigen den Fehler an (DataError oder der Fehlertext im
Steuerelement); sie sind nicht betroffen. Eigener Code, der für sie oder für etwas anderes Arrays füllt, ist es.
Lösung
Lesen Sie verknüpfte Tabellen mit einer
MoveNext-Schleife statt mitGetRows, und behandeln Sie den Fehler 3146:Dim rs As DAO.Recordset, n As Long On Error GoTo ReadFailed Set rs = CurrentDb.OpenRecordset("SELECT ID, Name FROM tblKunde", dbOpenSnapshot) Do Until rs.EOF n = n + 1 rs.MoveNext Loop Exit Sub ReadFailed: ' 3146: the source failed while reading; DBEngine.Errors may hold the driver's text Debug.Print Err.Number, DBEngine.Errors(0).Description- Wenn Sie je Spalte einmal außerhalb der Schleife ein Feldobjekt lesen (
Set fName = rs!Name), ist die Schleife etwa so schnell wieGetRows. - Ein Prozess, der bereits hängt, lässt sich nur im Task-Manager beenden; nicht gespeicherte Arbeit in diesem Access geht verloren.