ADS oSession:disconnect() Fehler

Advantage Database Server

Moderator: Moderatoren

ADS oSession:disconnect() Fehler

Beitragvon Armin » Do, 02. Jun 2016 19:08

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
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 356
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand

Re: ADS oSession:disconnect() Fehler

Beitragvon ramses » Do, 02. Jun 2016 19:58

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
ramses
1000 working lines a day
1000 working lines a day
 
Beiträge: 509
Registriert: Mi, 28. Jul 2010 17:16

Re: ADS oSession:disconnect() Fehler

Beitragvon hschmidt » Fr, 03. Jun 2016 10:11

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
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 157
Registriert: Mo, 09. Jan 2006 18:06
Wohnort: Paderborn

Re: ADS oSession:disconnect() Fehler

Beitragvon Armin » Fr, 03. Jun 2016 14:20

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
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 356
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand

Re: ADS oSession:disconnect() Fehler

Beitragvon Jan » Do, 20. Apr 2017 13:01

Hallo Hans,

schaue bitte mal dringend in deine PN...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
 
Beiträge: 11755
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle


Zurück zu ADS

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste