Jag har ett program skrivet i VB6, DAO med koppling till en SQL2000 via ODBC. Jag föreslår att du inte låter recordsetet ligga öppet. Utan öpnnar när du gör en koll: Hej Mikael! Hjälper inte. Koden ser ju nu så här, fungerar ej. Jag tycker din kod ser okej ut. url-taggen funkade inte på länken. Den var kanske för lång...Databas, VB
Programmet måste snurra 24 timmar, 365 dagar.
En gång varje minut kollas bland annat poster i en tabell.
Vid ett ev nätverksfel/odbc-fel måste programmet snurra vidare.
Nästa minut skall det på nytt koppla sig mot DB:n.
Hur gör jag en 100%-ig felhanterare.
Ser just nu ut så här:
tabell.close
db.close
set db=nothing
set db=workspaces(0).Opendatabese(dbnamn,dbdrivernoprompt,false,"ODBC;Database=123;UID=456;PWD=789;DSN=1234)
set tabell=db.openrecordset(tabellnamn,dbopendynaset,dbseechanges)
Detta fungerar inte.
Om jag startar om programmet, funkar det igen.
Dvs, hur jag jag en korrekt/komplett omstart av databaskopplingen mha kod.
Tacksam för snabbt svar.
/ MikaelSv: Databas, VB
<code>
Private Sub Timer1_Timer()
Dim db As DAO.Database
Dim tabell As DAO.Recordset
On Error GoTo Timer1_Timer_Err
Set db = OpenDatabase(dbnamn, dbDriverNoPrompt, False, "ODBC;Database=123;UID=456;PWD=789;DSN=1234")
Set tabell = db.OpenRecordset(tabellnamn, dbOpenDynaset, dbSeeChanges)
tabell.Close
db.Close
Set db = Nothing
Exit Sub
Timer1_Timer_Err:
Debug.Print Err.Number & ": " & Err.Description
End Sub
</code>Sv: Databas, VB
Man kan inte alltid vara säker på att minnet frigörs med en gång. Ta en titt på den här sidan för lite mer information:
http://msdn.microsoft.com/library/en-us/vbcon98/html/vbconvisualbasiccomponentshutdownrules.asp?frame=true
Om det krisar rejält tidsmässigt och du vill ha en (mycket ful) workaround tills dess du löst problemet kan du ju bara göra på följande vis:
<code>
Shell("Applikationen.exe")
End
</code>
Det vill säga öppna en ny instans av applikationen och stänga den befintliga. Men som sagt var... Snyggt är det inte. :)Sv: Databas, VB
Jag får ändå 'ODBC anrop misslyckades' när jag nästa gång kör set tabell=...
Nu stänger jag alla rs och db inom varje sub.
Jag har även tagit bort de globala rs och db, och ersatt dem med rs och db i varja sub.
/ MikaelSv: Databas, VB
Vad göra??
<code>
sub skicka()
on error goto fel:
dim db as dao.database, rs1 as dao.recodset, rs2 as dao.recordset
set db=workspaces(0).opendatabase("123",drivernoprompt,false,"ODBC;database=12;UID=34;PWD=56;DSN=78")
set rs1=db.openrecordset("select...",dbopendynaset,dbseechanges)
set rs2=db.openrecordset("select...",dbopendynaset,dbseechanges)
if rs1.bof=false then
...
...
...
end if
ut:
on error resume next
rs1.close
rs2.close
set rs1=Nothing
set rs2=Nothing
db.close
set db=Nothing
exit sub
fel:
resume ut:
end sub
</code>Sv: Databas, VB
Du kan ju testa med att lägga anslutningskoden i en separat funktion:
<code>
Private Function CurrentDB() As DAO.Database
On Error Resume Next
Set CurrentDB = WorkSpaces(0).OpenDatabase("123",drivernoprompt,false,"ODBC;database=12;UID=34;PWD=56;DSN=78")
End Function
sub skicka()
on error goto fel:
Dim db As DAO.Database
Dim rs1 As DAO.Recodset
Dim rs2 As DAO.Recordset
Set db = CurrentDB
If db Is Nothing Then
Debug.Print "Error while connecting..."
Else
Set rs1=db.openrecordset("select...",dbopendynaset,dbseechanges)
Set rs2=db.openrecordset("select...",dbopendynaset,dbseechanges)
If rs1.bof=false then
'...
End If
End If
ut:
On Error Resume Next
If Not rs1 Is Nothing Then
rs1.Close
Set rs1=Nothing
End If
If Not rs1 Is Nothing Then
rs2.Close
set rs2=Nothing
End If
db.close
Set db = Nothing
exit sub
fel:
resume ut:
end sub
</code>Sv: Databas, VB
Har rättat till det, men här kommer den igen:
http://msdn.microsoft.com/library/en-us/vbcon98/html/vbconvisualbasiccomponentshutdownrules.asp?frame=true