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: | Major | Last Reviewed: | 10/17/2003 |
---|
Keywords: | kbbug kbfix kbProgramming KB152318 |
---|
|