FIX: Date/Time Fields Fail to Update When Using a Dynaset
ID: Q126134
|
The information in this article applies to:
-
The Microsoft Foundation Classes (MFC), included with:
-
Microsoft Visual C++, 32-bit Editions, version 2.0
SYMPTOMS
An attempt to update a date/time field using a CTime object will fail. The
CRecordset::RFX_Date() doesn't work correctly, and the date/time field in
the database table isn't changed. This problem occurs only when passing
CRecordset::dynaset as the first parameter to the CRecordset::Open() member
function.
CAUSE
The RFX_Date() function that takes a CTime object as a parameter fails to
transfer the CTime data to its TIMESTAMP_STRUCT proxy before performing an
update.
RESOLUTION
To work around this problem, follow these steps:
- In one of the header files, such as the CRecordset's header file, create
the following function prototype:
void RFX_Date2( CFieldExchange* pFX, const char* szName, CTime& value );
- In the CRecordset's .CPP file or elsewhere, add this RFX_Date2()
definition:
void RFX_Date2(CFieldExchange* pFX, const char *szName,
CTime& value)
{
ASSERT(AfxIsValidAddress(pFX, sizeof(CFieldExchange)));
if (pFX->m_nOperation==CFieldExchange::BindFieldForUpdate)
{
if(pFX->m_nFieldType == CFieldExchange::param)
return;
//pFX-m_nFields hasn't been incremented yet so no need to
// subtract 1 for indexing m_pvFieldProxy
if (pFX->m_prs->m_pvFieldProxy[pFX->m_nFields] != NULL)
{
// Fill buffer (expected by SQLSetPos) with new field data
TIMESTAMP_STRUCT* pts;
pts = (TIMESTAMP_STRUCT*)
pFX->m_prs->m_pvFieldProxy[pFX->m_nFields];
pts->year = (SWORD)value.GetYear();
pts->month = (UWORD)value.GetMonth();
pts->day = (UWORD)value.GetDay();
pts->hour = (UWORD)value.GetHour();
pts->minute = (UWORD)value.GetMinute();
pts->second = (UWORD)value.GetSecond();
pts->fraction = 0;
}
}
RFX_Date(pFX, szName, value);
}
- Modify the DoFieldExchange member function of the CRecordset class,
replacing calls to RFX_Date with calls to the RFX_Date2 function
described above.
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed
at the beginning of this article. This problem was corrected in Microsoft
Visual C++ version 2.1.
MORE INFORMATION
MFC Technote #43 contains more information about record field exchange
(RFX) functions and CFieldExchange operations.
Additional query words:
2.00 3.00
Keywords : kbDatabase kbMFC kbODBC kbVC
Version : 2.00
Platform : NT WINDOWS
Issue type :