首页 > 解决方案 > SQLSetPos 中的游标状态无效

问题描述

全部,

ret = SQLForeignKeys( stmt_fk, NULL, 0, NULL, 0, NULL, 0, catalogName, SQL_NTS, schemaName, SQL_NTS, tableName, SQL_NTS );
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
{
    // error handling
}
bool fkFound = false;
for( ret = SQLFetch( stmt_fk ); ( ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO ) && ret != SQL_NO_DATA; ret = SQLFetch( stmt_fk ) )
{
    fkFound = true;
}
if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO && ret != SQL_NO_DATA )
{
    // error handling
}
else if( fkFound )
{
    ret = SQLSetPos( stmt_fk, 0, SQL_POSITION, SQL_LOCK_NO_CHANGE );
    if( ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO )
    {
    }
    else
    {
        // row processing
    }

在这里调用 SQLSetPos() 返回错误“无效游标状态”。ODBC API 没有重置语句句柄并将光标设置到记录集中的记录 1 的功能,所以我认为我应该使用这个,但它失败了。

我如何解决它?或者也许有另一种方法可以做我想做的事?

蒂亚!!

标签: odbcrecordset

解决方案


ODBC API 文档声明此错误会在以下情况下产生——

  • 处于执行状态,但没有结果StatementHandle集与StatementHandle.

  • (DM) 在 上打开了一个游标StatementHandle,但SQLFetch或者SQLFetchScroll没有被调用。

  • 游标在 上打开StatementHandle,并且SQLFetchSQLFetchScroll已被调用,但游标位于结果集开始之前或结果集结束之后。

  • 参数OperationSQL_DELETESQL_REFRESHSQL_UPDATE,并且光标位于结果集的开头之前或结果集的结尾之后。

基于此,我敢打赌前面存在一个未被注意到的(可能是无声的)错误,这是真正需要解决的问题。到目前为止,我建议查看运行的完整 ODBC 跟踪。


推荐阅读