Article ID: 145992 - Last Review: November 21, 2006 - Revision: 2.1

PRB: Global MFC DAO Objects Cause Assertions

This article was previously published under Q145992
Expand all | Collapse all

SYMPTOMS

An assertion can occur on line 729, 732, or 1314 of Daocore.cpp when you define an MFC DAO object that has its destructor called after the call to CWinApp::ExitInstance.

This will happen when an MFC DAO object is defined globally or as a member of a global object (like an MFC application's CWinApp-derived object).

CAUSE

CWinApp::ExitInstance() closes all open DAO workspaces by calling AfxDaoTerm() and removes them from the global workspace map. In the destructors for MFC DAO objects such as CDaoDatabase and CDaoRecordset, MFC tries to remove the workspace objects again.

RESOLUTION

Here are two workarounds:

  • Instead of using a global DAO object, define a global pointer to a DAO object. Be sure to destroy the MFC object before CWinApp::ExitInstance(). -or-

  • Explicitly assign the CDaoWorkspace object to the DAO object rather than allowing MFC to create a CDaoWorkspace object implicitly. You can do this by passing the workspace objects and database objects into the constructors of the CDaoDatabase and CDaoRecordset objects respectively. Or you can explicitly set the CDaoDatabase::m_pWorkspace and CDaoRecordset::m_pDatabase variables before opening the CDaoDatabase or CDaoRecordset. Here is an example:
       CDaoWorkspace   wsp;
       CDaoDatabase    db;
       CMyDaoRecordset rs;
    
       BOOL InitializeDBStuff()
       {
          db.m_pWorkspace=&wsp;
          db.Open( _T("D:\\work\\assert.mdb") );
          rs.m_pDatabase=&db;
          rs.Open(dbOpenDynaset, _T("Select * from table1"));
          rs.Close();
          db.Close();
       }

STATUS

This behavior is by design.

APPLIES TO
  • Microsoft Foundation Class Library 4.2, when used with:
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
Keywords: 
kbdatabase kbprb KB145992
Retired KB ArticleRetired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.
 

Article Translations