Brauche Hilfe:Probleme beim Schliessen von CDaoDatabase



  • Ich habe mir eine Klasse geschrieben um meine AccessDB in verschiedenen Threads zubenutzen.Aber beim Schliessen kriege ich eine unbehandelte Fehlermeldung.

    Beim schliessen gehe ich so vor,ich lasse die Threads auslaufen die auf die DB zugriffen,danach rufe ich forceClose()auf.forceClose() wartet bis alle Recordsets zurück sind,und ruft dann close auf.In close() werden dann alle Recordsets geschlossen,dann wird Close() von CDAoDatabase aufgerufen,dabei tritt der Fehler auf und zwar in dieser Zeile

    m_pDAODatabase->Release();
    


  • Hat jemand eine Idee woran das liegen könnte?



  • Ich habe immer noch nicht heraus gefunden woran das liegen könnte.Die Recordsets müssten ja alle geschlossen sein.



  • Weiss keiner eine Antwort?Oder wenigstens die Richtung in der ich den Fehler suchen muss?



  • Das Programm ist jetzt fast,fertig ich muss nur noch diesen Fehler rauskriegen.
    Weiss vieleicht jemand wie ich die Fehlermeldung verhindere?



  • Hallo !

    Vielleicht hilft dir ja das hier weiter.
    http://support.microsoft.com/?kbid=217216

    Tschüss



  • Die Installation des Servicespacks hat leider nichts gebracht.
    Hat jemand noch einen Vorschlag?



  • Hab mal die MSDN bemüht:

    Suchbegriffe: release database dao

    Das ist ein Artikel über einen Fehler in der Klasse, scheint genau das zu sein, was du hast.

    Zitat: (Meine Knöpfe funktionieren nicht 😞 )

    FIX: Problems with Using the MFC DAO Classes in a .DLL or .OCX

    [...]

    RESOLUTION
    To work around the problems with DAO in a DLL, do one of the following:

    Link all DLLs using the static version of MFC, except in the case of an .ocx that requires the shared MFC DLL.
    -or-
    Construct and Open a CDaoWorkspace object in the calling application so that the DAO engine is initialized and terminated in the application rather than in the any of your DLLs.
    -or-
    Use the dbDAO C++ classes provided with the DAO SDK, which is installed from the Visual C++ CD-ROM compact disc.

    STATUS
    Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug was corrected in Visual C++ 4.1.

    REFERENCES
    For more information about problems using DAO in DLLs, please refer to the following articles in the Microsoft Knowledge Base:

    Q149889 PRB: Assertion or Problems Using DAO in a DLL
    Q152315 PRB: When to Call AfxDaoTerm() in an Automation Server

    Additional query words: kbVC400bug



  • Ich benutze die Klasse aber nicht in einer DLL oder OCX aber ich werden mal ausprobieren ob der Fehler nicht auftritt wenn ich noch einen Workspace einbaue.
    Eidt:Er tritt noch auf,noch irgendeine Idee?



  • Es wäre vielleicht hilfreich, was das für ein Fehler ist.

    Ein ASSERT? (Ich weiß, das ist kein echter Fehler)
    Eine MessageBox?
    Eine Exeption?

    Kriegst du vielleicht irgendeinen Wert?
    Hast du irgendeine Warnung ignoriert?

    Ansonsten hab ich auch keinen Schimmer, besonders nicht von DAO direkt.

    Sorry, viel Erfolg noch.



  • Ich kriege:

    Eine unbehandelte Ausnahme in Autofinder.exe(DAO350.dll)
    

    Aber ich fange schon CDaoException und CMemoryException ab,und laut MSDN sind das die Exceptions die CDaoWorkspace beim schliessen wirft.



  • DAO ist nicht multithreadfähig. Bei Codeguru gibt es einen Workaround. Mußt mal suchen.



  • Ich benutze einen Workaround in meiner Klasse.
    Und zwar diesen:http://codeguru.earthweb.com/mfc_database/dao_multithreading.shtml



  • Close nicht aufzufufen bring auch nichts,der Fehler tritt dann auch auf.



  • Ich habe mal eine kleine Testumgebung für die Klasse geschrieben.
    Und folgendes rausgefunden:
    1)Wenn man die Klasse ohne Threads verwendet wird sie ohne Probleme geschlossen
    2)Der Zugriff auf Execute ist nur Möglich wenn man vorher mit AddRecordset ein Recordset erstellt hat.
    3)Sobald ein Zugriff auf die Klasse im Thread erfolgt kann die DB nicht mehr geschlossen werden

    Der Thread wurde nur nicht geschlossen



  • Erst dachte ich die Threads in meinen Programm schliessen nicht.Ich habe in der Testumgebung einen Button mit den ich den Thread schliessen kann und wenn ich den drücke und ein bisschen warte tritt der Fehler beim schliessen nicht auf.Dann habe ich ein Sleep(360000) zwischen den Befehl zum Schliessen des Threads und dem Schliessen der Datenbank in mein Programm gesetzt und der Fehler trat immer noch auf.Nun habe ich im Debugmode überprüft ob der Thread geschlossen wird und er wird geschlossen.
    Hat irgendjemand noch einen Vorschlag woran der Fehler liegen könnte?



  • Ich habe den Fehler immer noch nicht gefunden.Hat wirklich niemand eine Idee wie ich den Fehler finden oder umgehen kann?


Anmelden zum Antworten