Hi,
ich habe ein kleines Tool welches auf einem Rechner liegt und permanent Daten eines SQL Servers abruft. Hin und wieder kann es aber vorkommen, dass dieser nicht verfügbar ist oder dass der Rechner, auf dem das Tool läuft gerade nicht online ist. Im Code habe ich Resume Next eingebaut, jedoch erhalte ich, wenn das Tool keine Verbindung zum SQL Server bekommt diese Meldung: "Laufzeitfehler '-2147467259 (80004005)': [DBNETLIB][ConnectionWrite (send()).] Allgemeiner Netzwerkfehler. Weitere Informationen finden sie in der Dokumentation."
Ich möchte aber gern diesen Fehler abfangen. Wie mach ich das? Ich hatte auch schon mal probiert mit on error... if err.num = .... aber gehte nixe... ???
LG
datekk
Hallo datekk,
"Resume Next" ist ja auch keine Fehlerbehandlung sondern ein "abwürgen"
desselben.
Für eine Fehlerbehandlung brauchst du am Anfang einer Prozedur eine Anweisung,
was bei einem Fehler passieren soll
Private/Public Sub/Function Bla()
On Error GoTo Sprungmarke
'dein Code
Exit Sub/Function
Sprungmarke:
If Err.Number ... Then
'Mach was
End If
End Sub/Function
Wie du deinen konkreten Fehler behandeln kannst, müssten aber andere
beantworten (mit SQL-Server habe ich mich noch nicht beschäftigt).
gruss ekkehard
Zitat von: datekk am April 19, 2017, 21:02:18
aber gehte nixe... ???
Es gibt evtl. andere Fehlernummern z.B. aus ADO, die von dem Server kommen und nur in das Access propagiert werden. Schau mal mit der Intellisense-Hilfe ob es conn.Errors.Item.NativeError von der ADODB.Connection oder so etwas in der Richtung gibt.
Ein Fehler muß wie bereits gesagt normalerweise natürlich behandelt werden, sicherlich bei Aufrufen externer Routinen.
Zitat von: datekk am April 19, 2017, 21:02:18Im Code habe ich Resume Next eingebaut, jedoch erhalte ich, wenn das Tool keine Verbindung zum SQL Server bekommt diese Meldung: "Laufzeitfehler '-2147467259 (80004005)'[....]
Deine Frage erscheint mir unvollständig.
Wo/wann genau kommt es zu diesem Fehler?
Wenn du per Code auf die Daten zugreifst? - Dann sollte deine
On Error-Direktive greifen. Wenn sie das nicht tut, poste mal den relevanten Code.
Wenn der Fehler bei einem Zugriff über die Oberfläche (Form/Report wird geöffnet) auftritt, dann solltest du das
On Error-
Event (https://msdn.microsoft.com/en-us/library/office/ff836345.aspx) behandeln.
Hier der Code:
Set ConCN = New ADODB.Connection
With ConCN
.Provider = "MSDataShape"
.ConnectionString = "DATA PROVIDER=SQLOLEDB.1;Server=*****;DATABASE=******;UID=*****;PWD=*****;"
.CursorLocation = adUseServer
.Open
Der Fehler tritt an der Stelle ".Open" auf. Fehlermeldungen sind z.B.: "-2147467259: [DBNETLIB][ConnectionWrite (send()).]Allgemeiner Netzwerkfehler." oder "keine Verbindung" oder "-2147217900: SHUTDOWN ist in Bearbeitung."
Diese Fehler führen alle zum abbrechen der Anwendung trotz Fehlerbehandlung. Die Fehlerbehandlung scheint nicht zu funktionieren.
Ich habe eine zuhause einen Rechner mit Oracle 12g und Windows-Clients mit Access, die per ADO OLE darauf zugreifen. Das Problem, daß der Datenbankrechner nicht eingeschaltet ist oder per Netzwerk nicht erreichbar ist, tritt regelmäßig auf, hat aber nie zu einem Absturz geführt.
Es nützt auch nichts, den auslösenden Block zu zitieren. Eine Fehlerbehandlung muß dafür sorgen, daß später keine Aufrufe auf die fehlerhaften Objekte (hier: die ADODB.Connection) stattfinden.
Ein sinnvolle Logik wäre, z.B. eine Funktion aufbauConnection() as Boolean zu erstellen, worin sich der .open-Befehl befindet. Wenn diese Funktion FALSE zurückgibt, darf in Folge die ADODB-Verbindung nicht benutzt werden. Wenn Du mit resume next einfach weiterlaufen lässt, kracht es spätestens, wenn das erste Recordset oder der erste ADODB.Command aufgerufen wird.
Ich zitiere mal meine Funktion ausschnittsweise
Const strDBSystem As String = "OraOLEDB.Oracle"
Dim strConnectionString As String
strConnectionString = "Provider=" & strDBSystem & ";" & _
"Data Source=" & strServerIP & ":" & strServerPort & OracleSystemKey & ";" & _
"User ID=" & strUsername & ";" & _
"Password=" & strPassword
'Debug.Print strConnectionString
On Error GoTo Fehlermeldung_Oracle
Set mandantenConn = New ADODB.Connection
With mandantenConn
.IsolationLevel = adXactReadCommitted
.Mode = adModeShareDenyWrite
.CursorLocation = adUseServer
.ConnectionTimeout = 1
.CommandTimeout = 1
End With
mandantenConn.Open strConnectionString
MandantenVerbindungAufbauen = True
Exit Function
Fehlermeldung_DAO:
MsgBox Err.Description & " ", vbCritical, "Mandantenverbindung aufbauen "
Exit Function
Fehlermeldung_Oracle:
MsgBox "Error# " & mandantenConn.Errors(0).NativeError & ": " & mandantenConn.Errors(0).Description & " ", vbCritical, "Mandantenverbindung aufbauen "
Zitat von: datekk link=topic=22365.msg129988#msg129988Die Fehlerbehandlung scheint nicht zu funktionieren.
Wo ist denn die Fehlerbehandlung?
Kannst du bitte ein Beispiel posten, dass zwar auf den minimal erforderlichen Code reduziert ist, aber trotzdem dein Problem
vollständig illustriert?
Wenn ich eine Fehlerbehandlung für deinen Code schreibe, funktioniert diese.