KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q135666: FIX: Assertion Failure in CFieldExchange::GetColumnType()

Article: Q135666
Product(s): Microsoft C Compiler
Version(s): 2.0 2.1 2.2 4.0 4.1 4.2
Operating System(s): 
Keyword(s): kbDatabase kbMFC kbVC200bug kbVC210bug kbVC220bug kbVC400bug kbVC410bug kbVC420bug kbVC
Last Modified: 02-AUG-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- The Microsoft Foundation Classes (MFC), included with:
   - Microsoft Visual C++, 32-bit Editions, versions 2.0, 2.1, 2.2, 4.0, 4.1 
   - Microsoft Visual C++, 32-bit Enterprise Edition, version 4.2 
   - Microsoft Visual C++, 32-bit Professional Edition, version 4.2 
-------------------------------------------------------------------------------

SYMPTOMS
========

Using the MFC database classes with the Microsoft SQL Server ODBC driver
versions 2.50.0121 or 2.50.0126 may cause an assertion failure after a call to
SQLNumResultCols() in the CFieldExchange::GetColumnType() function.

CAUSE
=====

This error is caused by a bug in the ODBC driver that is exposed when the cursor
library is used, and happens after calling CRecordset::Requery() and then trying
to edit more than one record.

The following code in Dbrfx.cpp produces the assertion:

  #ifdef _DEBUG
    SWORD nResultColumns;
    AFX_SQL_ASYNC(m_prs,
                  ::SQLNumResultCols(m_prs->m_hstmt, &nResultColumns));
    ASSERT(nColumn >= 1 && (long)nColumn <= (long)nResultColumns);
  #endif //_DEBUG

::SQLNumResultCols returns 0 in nResultColumns, which causes an assertion on the
next line. This is due to a bug in the driver which sets the number of columns
in the result set to 0. The subsequent call to ::SQLDescribeCol will also fail
with SQL State S1002 "Invalid Column number" regardless of the column number
specified.

RESOLUTION
==========

To work around this problem, use a dynaset instead of a snapshot or get the
2.65.0240 version of the SQL Server driver that is included with Visual C++
5.0.


STATUS
======

Microsoft has confirmed this to be a bug with the ODBC 2.5 components. This bug
has been fixed in the 2.65.0240 version of the SQL Server driver that is
included with Visual C++ 5.0.

Additional query words: kbVC400bug DBRFX.CPP line 2185 line 2231

======================================================================
Keywords          : kbDatabase kbMFC kbVC200bug kbVC210bug kbVC220bug kbVC400bug kbVC410bug kbVC420bug kbVC500fix 
Technology        : kbAudDeveloper kbMFC
Version           : 2.0 2.1 2.2 4.0 4.1 4.2
Issue type        : kbbug
Solution Type     : kbfix

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.