FIX: DAO SDK's CdbRecordset::Requery() May Fail

ID: Q152318


The information in this article applies to:
  • The DAO SDK, included with:
    • Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.1


SYMPTOMS

Attempting to invoke the DAO SDK's CdbRecordset::Requery() method of the CdbRecordset class when the recordset has been opened with dbOpenDynaset and dbDenyWrite, may result in an error message similar to the following:


   Unhandled exception in <YourApp>.exe (DAO3032.DLL):
   0xC0000005: Access Violation 


CAUSE

Within the implementation of CdbRecordset::Requery found in DBDAO.CPP (line 1645), the casting of a COleVariant method is performed incorrectly. The cast is performed as:


   Var.pdispVal    = (LPDISPATCH)pq(); 
The correct implementation should be:

   Var.pdispVal    = (LPDISPATCH)pq->GetInterface(); 


RESOLUTION

Derive a new class from CdbRecordset and override the Requery method with the following:


   VOID CdbRecordset::Requery( CdbQueryDef *pq )   // = NULL
   {
       DAORecordset*   prs = (DAORecordset *)GetInterface();
       COleVariant     Var;

       //Manually load the Query Def as a dispatch
       if (!pq)
       {
           Var.vt          = VT_ERROR;
           Var.scode       = DISP_E_PARAMNOTFOUND;
       }
       else
       {
           Var.vt          = VT_DISPATCH;
           Var.pdispVal    = (LPDISPATCH)pq->GetInterface();
       }

       DAOMFC_CALL(prs->Requery(Var));
   } 


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 fixed in the DAO SDK that comes with Visual C++ version 5.0.

Additional query words:

Keywords : kbprg
Version : 4.0 4.1
Platform : NT WINDOWS
Issue type : kbbug


Last Reviewed: July 28, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.