Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Fehlermeldung trotz Resume Next

Begonnen von datekk, April 19, 2017, 21:02:18

⏪ vorheriges - nächstes ⏩

datekk

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
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Wurliwurm

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.

PhilS

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 behandeln.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

datekk

#4
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.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

Wurliwurm

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    "

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor