FIX: SetFieldNull() Asserts in DBCORE.CPP Line 4055 or 4062 (157876)
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), when used with:
- Microsoft Visual C++, 32-bit Professional Edition 4.2
- Microsoft Visual C++, 32-bit Enterprise Edition 4.2
- Microsoft Visual C++, 32-bit Learning Edition 4.2
This article was previously published under Q157876 SYMPTOMS
Calling SetFieldNull() for a date or, in UNICODE builds, a text field
causes an assert in DBCORE.CPP at line 4055 or line 4062:
void CRecordset::SetNullParamStatus(DWORD nParam)
{
ASSERT(nParam < m_nParams); // <= Line 4055
m_pbParamFlags[nParam] |= AFX_SQL_FIELD_FLAG_NULL;
}
void CRecordset::ClearNullParamStatus(DWORD nParam)
{
ASSERT(nParam < m_nParams); // <= Line 4062
m_pbParamFlags[nParam] &= ~AFX_SQL_FIELD_FLAG_NULL;
}
CAUSE
During Update(), both the RFX_Date() and RFX_Text() functions incorrectly
add the date or unicode text field to the parameter map:
case CFieldExchange::NameValue:
...
// Fall through
case CFieldExchange::Value:
...
// Add the member address to the param map
pFX->m_prs->m_mapParamIndex.SetAt(&value, (void*)nField);
A subsequent call to SetFieldNull() will try to determine whether the field
is a parameter by checking the index returned by GetBoundParamIndex(). An
index >= 0 implies that the field is a parameter:
void CRecordset::SetFieldNull(void* pv, BOOL bNull)
{
...
int nIndex = GetBoundParamIndex(pv);
if (nIndex >= 0)
{
if (bNull)
SetNullParamStatus(nIndex);
else
ClearNullParamStatus(nIndex);
return;
}
... // Handle the case where the field is not a parameter
}
Because the RFX function incorrectly added the field to the parameter map,
an index >= 0 is returned by GetBoundParamIndex(). Because of this,
SetFieldNull() incorrectly calls the function to set or clear the Null
parameter status rather than the Null field status. If the index returned
by GetBoundParamIndex() is less the member variable CRecordset::m_nParams,
then the assert will occur:
ASSERT(nParam < m_nParams);
RESOLUTION
Create your own RFX_Date() or RFX_Text() function and comment out the line
that adds the field to the parameter map. See the MORE INFORMATION section
below for more for the steps to accomplish this.
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++
version 5.0.
Modification Type: | Major | Last Reviewed: | 12/1/2003 |
---|
Keywords: | kbBug kbDatabase kbfix kbNoUpdate kbVC500fix KB157876 |
---|
|