c++ - 尝试关闭时游标状态无效

标签 c++ oracle odbc

我有大量的 INSERT 语句要运行。当我运行它们时,我可以理解地得到“超出最大打开游标数”。

好的 Oracle,所以我将在运行 INSERT 语句后立即关闭游标。

SQLCloseCursor( hStmt )

但是 Oracle 对此说“无效的游标状态”。

为什么 Oracle 对我关闭游标不满意?我通过 MySQL dsn 测试了相同类型的查询,MySQL 似乎没有提示在 INSERT 语句后立即关闭游标。

编辑--

这是执行查询的代码

CHECK 是一个检查 SQLRESULT 并记录错误的函数,如果成功则返回 TRUE,如果失败则返回 FALSE。 “status()”使用 SQLGetDiagRec() 记录其余的错误信息。

  SQLINTEGER nonquery( char * nonquery )
  {
    SQLINTEGER rowsAffected = 0 ;

    SQLHANDLE hStmt ;
    CHECK( SQLAllocHandle( SQL_HANDLE_STMT, hConn, &hStmt ), "allocate handle for statement" ) ;

    if( !CHECK( SQLExecDirectA( hStmt, (SQLCHAR*)nonquery, SQL_NTS ), "execute query" ) ) 
    {
      status( SQL_HANDLE_STMT, hStmt, __LINE__ ) ;
    }

    // Get rows affected
    if( !CHECK( SQLRowCount( hStmt, &rowsAffected ), "row count after non-query" ) )
    {
      status( SQL_HANDLE_STMT, hStmt, __LINE__ ) ;
    }

    if( ! CHECK( SQLFreeStmt( hStmt, SQL_CLOSE ), "Sql free stmt" ) )
    {
      status( SQL_HANDLE_STMT, hStmt, __LINE__ ) ;
    }

    // CLose up.
    if( !CHECK( SQLCloseCursor( hStmt ), "close cursor" ) )
    {
      status( SQL_HANDLE_STMT, hStmt, __LINE__ ) ;
    }

    return rowsAffected ;
  }

我这样调用非查询

nonquery( "sql statement" ) ;

所以我得到:

[24000][0] [Oracle][ODBC]Invalid cursor state.

起初,(这可能是由于 INSERT 语句没有游标?),后来,在多次插入之后(非查询被简单地连续调用了很多次),我得到

ORA-01000: maximum open cursors exceeded

最佳答案

我认为您要关闭光标两次:

SQLFreeStmt(SQL_ CLOSE) - 来自 MSDN : "关闭与 StatementHandle 关联的游标(如果已定义)并丢弃所有未决结果"

因此,调用 SQLCloseCursor 将返回“无效游标状态”(参见 Note)。

我想你需要的是:

SQLCloseCursor(hStmt);

SQLFreeHandle(SQL_HANDLE_STMT,hStmt) // replace SQLFreeStmt with this

关于c++ - 尝试关闭时游标状态无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1148169/

相关文章:

c++ - Arduino - 如何将 uint16_t 转换为十六进制

c++ - 依靠确定性销毁,避免返回时销毁

mysql - PL/SQL 错误 ORA-01403 : No data found. 未收到预期结果

oracle - 为什么 Oracle Sql*Plus 会打印很多不需要的标题?

C++ 编译器错误递归模板

c++ - 如何从 Qt 中的文件加载图像?

c# - 单个 ODBC ExecuteNonQuery 中的多个插入语句 (C#)

odbc - 是否可以通过 ODBC 驱动程序将 Power BI 连接到 kdb 数据库?

oracle - 如何正确地制作公共(public)同义词

ms-access - 错误 [HY000] 一般错误 : Invalid file dsn ''