Branje povezane tabele ODBC se nikoli ne konča
Okolje
Lastna koda VBA, ki povezane tabele ODBC ali OData bere z DAO Recordset.GetRows, v kateri koli različici
Accessa, z gonilnikom Microsoft ODBC Driver 18 for SQL Server ali z gonilnikom Wkl OData; drugi gonilniki niso
podprti.
Vzrok
Ko vir odpove sredi rezultata – vrstica, ki je strežnik ne more izračunati, podatkovna storitev, ki odgovori s
429 (preveč zahtev), prekinjena povezava –, se GetRows nikoli ne vrne: DAO v zanki v eni niti pri 100 %
obremenitvi procesorja kliče gonilnikov SQLFreeStmt, Access pa visi, dokler ga ne končate. MoveNext prek
istih zapisov namesto tega sproži napako 3146 („ODBC call failed“).
Kontrolniki WKL berejo z MoveNext in prikažejo napako (DataError ali besedilo napake v kontrolniku); težava
jih ne zadeva. Zadeva pa lastno kodo, ki zanje ali za kar koli drugega polni polja.
Rešitev
Povezane tabele namesto z
GetRowsberite z zankoMoveNextin obravnavajte napako 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- Če objekt polja za vsak stolpec preberete enkrat, zunaj zanke (
Set fName = rs!Name), je zanka približno tako hitra kotGetRows. - Proces, ki že visi, lahko končate samo v upravitelju opravil; neshranjeno delo v tem Accessu se izgubi.