17. oktober 2007 - 07:12Der er
8 kommentarer og 1 løsning
MS Access 2003 ODBC Call Failed
Hej alle
Jeg har en Access 2003 database der er linket op mod DB2 via ODBC. Når jeg åbner databasen starter den en scheduler form som holder øje med hvornår der skal hentes data fra DB2 som bliver behandlet og mailed ud i form at rapporter, helt automatisk.
Det første stykke tid virker det hele fint, men hvis jeg lader databasen stå åben i nogle timer og scheduleren begynder at hente data, så får jeg en ODBC Call failed, og hele skidtet går i stå.
Det er som om at den mister forbindelsen til DB2 serveren, hvilket jeg ikke rigtigt forstår eftersom det hele kører på samme server, altså lokalt :-).
ODBC-Timeout står som standard til 0 i MS Access, og har sat den til 0 i samtlige forespørgsler og alt kører som snapshots.
Håber i har nogle idéer til hvad der evt. går galt, og hvad jeg kan gøre for at afhjælpe problemet.
Have you tried reading data from db2 without using the schedulere form? If so does it work?
Are you using a timer in the form? If so then maybe you should disable it when you start reading data from dB2 then activate when finished.
Synes godt om
Slettet bruger
17. oktober 2007 - 13:54#2
Hi Terry
Everything works with and without the scheduler form, until I leave it alone for a couple hours and then it drops all ODBC connections. There is a timer in the form, but it's only refreshing in between "jobs".
I did however find a nice solution myself though (sorry hehe), I've made a module that activates before each update and deletes all ODBC linked tables and recreates the link. That will hopefully do the trick.
Hej Nu kan jeg godt se du har lukket spørgsmålet, men jeg vil lige dele mine erfaringer alligevel. Jeg undgår helst linkede tabeller, det kører meget ustabilt - istedet bruger jeg 'pass through' forespørgsler (videregivelse). Det virker utroligt stabilt fordi sql'en bliver sendt direkte til serveren. Jeg bruger 2 forespørgsler Q_select og Q_action som jeg har et lille modul der ændre sql fra mine forms her et eksempel med Q_Select.
Public Function QrySelect(sSql As String ) As DAO.Recordset
Dim q As DAO.QueryDef Dim rs As DAO.Recordset Set q = CurrentDb.QueryDefs("Q_Select") 'OdbcConString er en global variabel q.Connect = "ODBC;" & OdbcConString
q.sql = sSql 'Debug.Print q.Connect
Set rs = q.OpenRecordset Set QrySelect = rs q.Connect = "ODBC;" q.Close Set q = Nothing End Function
Mine database kører noget mere stabilt efter jeg har implementeret ovenstående både med MSSQL, MYSQL og en enkelt DB2.
mvh Niels
Synes godt om
Slettet bruger
19. oktober 2007 - 07:17#4
Hej Niels,
mange tak for dit input, det ser ret interessant ud.
Jeg var nok for hurtig til at lukke spørgsmålet, for det viser sig jeg er ikke nået et skridt videre. Jeg får stadig Run-time error '3146' ODBC Call failed.
Selvom jeg har et modul der sletter samtlige linkede ODBC tabeller og genopretter dem, så virker det altså stadig ikke. Det er ikke fordi maskinen mister netværksforbindelsen, jeg har haft en RDP connection til den de sidste 36 timer uden problemer.
Synes godt om
Slettet bruger
19. oktober 2007 - 07:19#5
Som jeg skrev i spørgsmålet, så har jeg sørget for at ODBC-Timeout står som standard til 0, både for databasen og samtlige forespørgsler og VBA scripts.
Jeg kan ikke se nogen grund til at det ikke virker og det irreterer mig helt vildt :-)
Hej Når ODBC timeout = 0 får du (eller ihvertfald burde du) ikke få 'timeout error', men du er vel heller ikke sikker på at det er en 'timeout'. 'ODBC Call failed' kan dække over flere errors i din connection. Jeg googlede lidt: http://support.microsoft.com/kb/161288
Niels
Synes godt om
Slettet bruger
19. oktober 2007 - 10:02#7
Yes, det har du helt ret i, jeg har også her til morgen udvidet min error handling lidt, så jeg får alle bagvedligende fejl frem. Håber det virker, ellers er jeg en smule lost :-)
Synes godt om
Slettet bruger
19. oktober 2007 - 10:04#8
Koden jeg bruger er som følger, burde ha' samme effekt som den du linkede:
Dim objErr As ErrObject On Error GoTo Err_Form_Timer
Bla bla bla kode..........
Exit_Form_Timer: Exit Sub
Err_Form_Timer: Select Case Err Case 3146 To 3299 For Each objErr In DBEngine.Errors MsgBox objErr.Description Next Case Else MsgBox Err.Description End Select
så må vi håbe du får en mere sigende error message
Niels
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.