12. januar 2003 - 16:12Der er
3 kommentarer og 1 løsning
Fejl når SQL-server er stoppet
Jeg forsøger i Access97 at sammenkæde en MSSQL tabel i VB v.h.a. CreateTabledef og TableDefs.Append. Det går også fint så længe SQL-serveren kører. Jeg har også indbygget fejlhåndtering hvis noget skulle gå galt. Idéen er at hvis min primære SQL-server er nede, skal den sammenkædede tabel pege på min sekundære (identiske) SQL-server. Problemet opstår hvis SQL-serveren ikke kører. Da kommer der ingen kørselsfejl i Access (som jeg kan fange og reagere på), men istedet en fejl fra Microsoft SQl Server Logon, som jeg ikke kan fange i min kode. Hvordan kan man checke om en server kører uden at få en fejl som kræver brugerhåndtering?
Her er koden:
Public Function ConnectSQLServer() Dim strSQL As String Dim dbs As Database, tdf As TableDef Dim strConnect As String, strDSN As String Dim UserID As String, Password As String Dim Tries As Integer
On Error GoTo ErrorHandler
DoCmd.Hourglass (True)
Set dbs = CurrentDb Tries = 1 DBEngine.LoginTimeout = 1
On Error Resume Next ' Fjern eksisterende kæde dbs.TableDefs.Delete ("Table1") On Error GoTo ErrorHandler
' Prøv først primær server strDSN = "Server1" GoTo Connect
NextServer: On Error GoTo 0 ' Prøv anden server If Tries < 5 Then If strDSN = "Server1" Then strDSN = "Server2" Tries = Tries + 1 Else strDSN = "Server1" Tries = Tries + 1 End If Else ' Send alarm GoTo ErrorHandler End If
On Error GoTo ErrorHandler dbs.TableDefs.Refresh ConnectSQLServer = True
ExitHandler: DoCmd.Hourglass (False) Exit Function
ErrorHandler: ConnectSQLServer = False LogEvent ("Det lykkedes ikke at få forbindelse til nogen af serverne. Fejl: " & Err.Number & " " & Err.Description) Resume ExitHandler End Function
Jeg fandt selv løsningen og bruger nu ADO og OLE DB til at teste om forbindelsen/serveren kører. På den måde undgår jeg at bruge ODBC og kan dermed fange en evt. fejl ved oprettelse af tilslutningen. Når først jeg har konstateret at forbindelsen er OK sammenkæder jeg mine servertabeller med ADO som vanligt.
'------------------------------------------------------------ ' Tester at forbindelsen til en af SQL-serverne er OK ' Bruger ADO og kræver derfor reference til ' <Microsoft ActiveX Data Objects 2.0 Library> eller højere. '------------------------------------------------------------ Public Function SQLServerConnected(ByRef ServerOK) Dim Conn As ADODB.Connection Dim strConnect As String, strSQLServer As String Dim Tries As Integer
On Error GoTo ErrorHandler Set Conn = New ADODB.Connection ' Hent tilslutningsoplysninger fra systemtabellen GetSQLValues On Error Resume Next
Tries = 1
' Prøv først primær server strSQLServer = strSQLServer1 GoTo Connect
NextServer: LogEvent ("Ingen forbindelse til " & strSQLServer) ' Prøv anden server If Tries < 5 Then If strSQLServer = strSQLServer1 Then strSQLServer = strSQLServer2 Tries = Tries + 1 Resume Connect Else strSQLServer = strSQLServer1 Tries = Tries + 1 Resume Connect End If Else GoTo ErrorHandler End If
Connect: On Error GoTo NextServer strConnect = "Provider=sqloledb;Data Source=" & strSQLServer & ";Initial Catalog=" & strSQLDB & ";User Id=" & strSQLUser & ";Password=" & strSQLPassword Conn.Open strConnect ' Hvis vi når hertil er alt OK, returnér reference til den kørende server. ServerOK = strSQLServer SQLServerConnected = True
ExitHandler: On Error Resume Next Conn.Close Set Conn = Nothing Exit Function
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.