Avatar billede Slettet bruger
17. oktober 2007 - 07:12 Der 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.
Avatar billede terry Ekspert
17. oktober 2007 - 12:07 #1
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.
Avatar billede 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.
Avatar billede nih Novice
18. oktober 2007 - 23:15 #3
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
Avatar billede 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.
Avatar billede 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 :-)
Avatar billede nih Novice
19. oktober 2007 - 08:45 #6
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
Avatar billede 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 :-)
Avatar billede 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
Avatar billede nih Novice
19. oktober 2007 - 10:38 #9
så må vi håbe du får en mere sigende error message

Niels
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester