Seite 1 von 1

ADS oSession:disconnect() Fehler

Verfasst: Do, 02. Jun 2016 19:08
von Armin
Hallo,

ich erzeuge eine Verbindung zum ADS mit
oSession := dacSession():New( "ADSDBE", cServerDrive )

dann läuft das Programm, alles soweit gut. In meiner Beenden-Funktion mache ich dann ein

Code: Alles auswählen

IF VALTYPE(oSession)= "O" .and. oSession:isConnected()
    oSession:disconnect()
Häufig kommt dann folgende Meldung:

oError:description : Interne Datenstrukturen beschädigt
oError:filename :
oError:genCode : 41
oError:operation : dacCloseAll
oError:osCode : 0
oError:severity : 2
oError:subCode : 5
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von DACDATASOURCE:DESTROY(208)
Aufgerufen von DACSESSION:DISCONNECT(449)
...

Den Fehler bekomme ich auch, wenn ich vor dem oSession:disconnect() ein dbcloseall() ausführe.

Was läuft da falsch? Hat jemand eine Idee?

Ich habe jetzt noch weiter getestet. Wahrscheinlich hat eine DBF ein Problem, da es nicht in allen Programmen vorkommt.

Grüße, Armin

Re: ADS oSession:disconnect() Fehler

Verfasst: Do, 02. Jun 2016 19:58
von ramses
Hallo Armin

ich hatte auch schon öfters einige Probleme mit "Interne Datenstrukturen beschädigt" im Zusammenhang mit ADS.

Ich gehe davon aus dass du eine aktuelle Version Xbase verwendest. (Da waren doch mal einige Probleme in der ADSDBE)

Als erstes würde ich folgende DLL's überprüfen:
ace32.dll, adsloc32.dll,axcws32.dll
Dies sind die "Verbindungs" DLL's von ADS --> Alaska liefert hier leider die sehr alte Verion 7.0 v. 2003 aus. Ersetzte diese mit neueren z.b. der Version 10.10.49
Beachte die Version des ADS-Server's sollte die gleiche Version haben.

Die Verbindung erstelle ich mit:
oSession := dACSESSION():NEW( "DBE=ADSDBE;SERVER=\\192.168.23.10:6262\DATEN;ADS_REMOTE_SERVER" )

Verwendest du "alte" DBF's die z.B. noch mit Clipper erstellt wurden? Dann überprüfe den Dateiheader der Datei. Oder erstelle diese mit dbcreate( , , "ADSDBE") neu.

Seit ich dies beachte hatte ich keine Probleme mit "Interne Datenstrukturen beschädigt" im zusammenhang mit ADS mehr gehabt.

Cu Carlo

Re: ADS oSession:disconnect() Fehler

Verfasst: Fr, 03. Jun 2016 10:11
von hschmidt
Hallo Armin,

auch ich hatte früher häufiger IDSC-Probleme beim Beenden der ADS-Connection über die ADSDBE und habe das deshalb auf einen DLL-Call auf die ACE32.DLL umgebogen:

Code: Alles auswählen


PROCEDURE CloseDataBases()
   LOCAL aWS, i
   LOCAL oSession
   LOCAL hServer

   hServer      := GetConnctionHandle ( )

    IF hServer > 0
        //ADS-Connection beenden
        oSession := GetsoSession ()
        IF oSession <> NIL .AND. oSession:isConnected ()

           /*
            * Absichern der shutdown-sequence vor rekursiven Fehlern
            * in DbCommit() udgl.
            */
            aWS := WorkSpaceList()
            FOR i:= 1 TO len(aWS)
                BEGIN SEQUENCE
                  /*
                   * Erzwinge das erfolgreiche Beenden aller
                   * anstehenden Record updates im aktuellen
                   * Workspace.
                   */
                   (aWS[i])->(DbCommit())
                   (aWS[i])->(DbCloseArea())
                RECOVER

                   (aWS[i])->(DbRRollback())
                   (aWS[i])->(DbCloseArea())
                ENDSEQUENCE
            NEXT

            // da die oSession:Disconnect() - Methode der ADSDBE nicht funktioniert,
            // wird hier ein DLL-Call auf die AdsDisconnect-Methode in der ACE32.DLL gemacht
            DLLCall("ACE32.DLL", DLL_STDCALL, "AdsDisconnect",hServer)
        ENDIF
    ENDIF
RETURN

hServer und oSession merke ich mir beim Connect in statischen Variablen, die ich mit den GetConnectionHandle- und GetsoSession-Funktionen auslesen kann.
Möglicherweise ist das in der aktuellen Version der ADSDBE nicht mehr erforderlich - bei mir funktioniert's jedenfalls.

Viele Grüße

Hans

Re: ADS oSession:disconnect() Fehler

Verfasst: Fr, 03. Jun 2016 14:20
von Armin
Hallo Carlo und Hans,

vielen Dank!
Ich habe die Möglichkeiten getestet, aber da das dbcloseall() vor dem :disconnect() auch die Fehlermeldung "interne Datenstrukturen beschädigt" brachte, habe ich mal versucht die Workareas einzeln zu schliessen:

Code: Alles auswählen

 
          aWorkSpaceList := WorkSpaceList()
           for i:= 1 to len(aWorkSpaceList)
              (aWorkSpaceList[i])->(dbclosearea())
           next
Dabei habe ich festgestellt, dass es bei einer DBF mit 2 Memodateien passierte. Diese hatte ich noch vergessen umzukopieren. D.h. es müssen alle DBF mit 2 Memodateien mit z.B. DBFNTX geöffnet werden, die Struktur mit ADSDBE erstellt und die Inhalte einkopiert werden.
Das wußte ich eigentlich schon von einem Beitrag von Tom in diesem Forum.

Beste Grüße, Armin

Re: ADS oSession:disconnect() Fehler

Verfasst: Do, 20. Apr 2017 13:01
von Jan
Hallo Hans,

schaue bitte mal dringend in deine PN...

Jan