BUG: CRecordset Does Not Set HSTMT Attributes for UpdatesID: Q178967
|
When updating using the cursor library or when using a cursor that causes MFC to use SQL statements to update, CRecordset errors can occur when using strings containing ODBC escape sequences. For example, the string [ASCII 147]{d2fcfefb-6126-11d1-84c1-0020afd6c52f}[ASCII 148] may cause a data conversion error because [ASCII 147]{d[ASCII 148] is the ODBC escape sequence for a date. The error occurs whether the SQLSetStmtOption() attribute SQL_NOSCAN is set to SQL_NOSCAN_ON or SQL_NOSCAN_OFF.
In the CRecordset::PrepareUpdateHstmt() function, CRecordset allocates a
handle to use to update m_hstmtUpdate. However, CRecordset does not apply
the HSTMT attributes on its default HSTMT, m_hstmt, to m_hstmtUpdate.
Therefore any statement attributes set by the user will not be seen in an
update.
For example, given the code:
void CSampleSet::OnSetOptions(HSTMT hstmt)
{
CRecordset::OnSetOptions(hstmt);
SQLSetStmtOption(hstmt, SQL_NOSCAN, SQL_NOSCAN_ON);
}
updates may fail for fields that contain ODBC escape because m_hstmtUpdate
will have the SQL_NOSCAN option turned off. For example you might get a
data conversion error from the ODBC driver.
It is possible to work around this bug by taking the following steps:
For dynamically linking the MFC library:
if (m_hstmtUpdate == SQL_NULL_HSTMT)
{
AFX_SQL_SYNC(::SQLAllocStmt(m_pDatabase->m_hdbc, &m_hstmtUpdate));
if (!Check(nRetCode))
{
TRACE0("Error: failure to allocate update statement.\n");
AfxThrowDBException(nRetCode, m_pDatabase, m_hstmtUpdate);
}
}
to the following:
if (m_hstmtUpdate == SQL_NULL_HSTMT)
{
AFX_SQL_SYNC(::SQLAllocStmt(m_pDatabase->m_hdbc, &m_hstmtUpdate));
if (!Check(nRetCode))
{
TRACE0("Error: failure to allocate update statement.\n");
AfxThrowDBException(nRetCode, m_pDatabase, m_hstmtUpdate);
}
OnSetOptions(m_hstmtUpdate);
}
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this bug and will post new information here in the Microsoft Knowledge Base as it becomes available.
For more information on ODBC escape sequences, see Chapter 8 and Appendix C, ODBC Programmers Reference.
Additional query words: scalar functions kbVC500bug kbVC600bug kbmfc kbdatabase kbodbc
Keywords : kbDatabase kbMFC kbODBC kbVC kbVC600bug
Version : WINDOWS:5.0,5.0sp1,5.0sp2,5.0sp3; WINNT:5.0,5.0sp1,5.0sp2,5.0sp3
Platform : WINDOWS winnt
Issue type : kbbug
Last Reviewed: August 5, 1999