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



The information in this article applies to:

  • The DAO SDK, when used with:
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 4.1

This article was previously published under Q152318

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.

Modification Type:MajorLast Reviewed:10/17/2003
Keywords:kbbug kbfix kbProgramming KB152318