Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: datekk am April 19, 2017, 21:02:18

Titel: Fehlermeldung trotz Resume Next
Beitrag von: datekk am April 19, 2017, 21:02:18
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
Titel: Re: Fehlermeldung trotz Resume Next
Beitrag von: Beaker s.a. am April 19, 2017, 23:27:44
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
Titel: Re: Fehlermeldung trotz Resume Next
Beitrag von: Wurliwurm am April 20, 2017, 10:09:41
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.
Titel: Re: Fehlermeldung trotz Resume Next
Beitrag von: PhilS am April 20, 2017, 11:58:55
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.

Titel: Re: Fehlermeldung trotz Resume Next
Beitrag von: datekk am April 28, 2017, 09:51:29
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.
Titel: Re: Fehlermeldung trotz Resume Next
Beitrag von: Wurliwurm am April 28, 2017, 11:19:05
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    "
Titel: Re: Fehlermeldung trotz Resume Next
Beitrag von: PhilS am April 28, 2017, 12:43:30
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.