ADS oSession:disconnect() Fehler

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

ADS oSession:disconnect() Fehler

Beitrag 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
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: ADS oSession:disconnect() Fehler

Beitrag 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
Valar Morghulis

Gruss Carlo
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: ADS oSession:disconnect() Fehler

Beitrag 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
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 389
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: ADS oSession:disconnect() Fehler

Beitrag 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
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: ADS oSession:disconnect() Fehler

Beitrag von Jan »

Hallo Hans,

schaue bitte mal dringend in deine PN...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten