FIX: Invalid Cursor State Error with the MS Oracle ODBC Driver

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Symptoms

The Microsoft Foundation Classes (MFC) ODBC database classes supplied with Visual C++ have a CRecordset::Requery() method that refreshes the records in an open recordset. The CRecordset::Requery() method calls the ODBC API function SQLExecute() followed by SQLExtendedFetch(). If a record in a Dynaset type recordset is updated before calling CRecordset::Requery(), the following error message is generated:

[Microsoft][ODBC driver for Oracle]Invalid cursor state.

Resolution

Here are two ways to prevent this error when using the MFC ODBC classes:


  • Call CRecordset::Close() followed by CRecordset::Open() instead of CRecordset::Requery() to refresh the recordset.


    -or-
  • Use the ODBC Cursor Library and a Snapshot type recordset. Call CRecordset::Requery() as usual.
NOTE: If using the ODBC API directly, call SQLPrepare() before calling SQLExecute() and SQLExtenedFetch() to refresh the recordset.

Status

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This issue has been corrected in the Microsoft Oracle ODBC Driver version 2.573.2927 or higher. This driver can be found in Visual Studio 6.0, Data Access Software Development Kit (SDK) 2.0 or higher, and in the Microsoft Data Access Components (MDAC) version 2.0 or higher. You can download the latest version of MDAC 2.0 from the following Web address:

More Information

Steps to Reproduce Behavior

The easiest way to reproduce the bug is to use ODBCTest. The following steps use ODBCTest.

  1. Allocate environment and connection handles and connect to an Oracle data source. (Full Connect)
  2. Allocate the statement handle and set the following statement attributes with SQLSetStmtAttr:

    SQL_ATTR_CURSOR_TYPE = SQL_CURSOR_KEYSET_DRIVEN
    SQL_ATTR_CONCURRENCY = SQL_CONCUR_VALUES
  3. SQLPrepare and SQLExecute the following statement (the table is located on most Oracle servers):

    "select deptno, dname, loc from scott.dept"
  4. Bind all columns (Bind col all) or call SQLBindCol on each of the columns.
  5. Call SQLExtendedFetch to get the first row of data.
  6. Modify a column and call SQLSetPos with the SQL_UPDATE option.
  7. Use the SQLFreeStmt with SQL_CLOSE option to close the statement handle.
  8. Re-execute the statement with SQLExecute.
  9. Call SQLExtendedFetch again. The following error occurs:

    [Microsoft][ODBC driver for Oracle]Invalid cursor state.
Propiedades

Id. de artículo: 183295 - Última revisión: 07/18/2012 - Revisión: 1

Comentarios