C / C ++ ODBC SQLExec获取SQLSTATE 24000无效的游标状态

问题描述

我试图利用可重用的预处理语句,仅从DB(sqlMX)提取1行。 我需要2个问题的帮助(其中1个已部分解决):

    1. 在这里,我知道问题出在哪里,但我不明白为什么会出问题或为什么要出解决方案。如果在得到sql_NO_DATA_FOUND之前不调用sqlFetch,那么我的第二个sqlExecute将获得sqlCODE24000。为什么语句句柄要求我用sqlFetch完成整个结果集的处理,直到获得sql_NO_DATA_FOUND?我想要的只是对1行进行sqlFetch,并使用新参数执行sqlExecute语句。是否存在一些隐式游标?如何摆脱游标而不重复调用sqlFetch?当我知道只需要返回一行时,如何避免隐式游标?
    1. 在循环中,每个sqlExecute + sqlFetch集之间存在〜35毫秒的延迟。同时,在Java JDBC应用中,相同的操作大约需要16毫秒。我的期望是C代码性能至少比Java代码高5倍。那么,放慢脚步/我想念什么呢?

我不允许发布代码,但这是步骤序列:

  • sqlPrepare(hstmt,“从tab1中选择col2,其中col1 =?”,sql_NTS);
  • 用于传出col1值的sqlBindParameter。
  • 用于输入col2值的sqlBindCol。
  • 循环:
    • 填充col1主机变量。
    • sqlExecute(hstmt);
    • sqlFetch(hstmt); //获得第一行
    • sqlFetch(hstmt); //获取sql_NO_DATA_FOUND以避免在下一个sqlExecute上出现24000错误
    • 重复。

如果有任何见识,将不胜感激。

谢谢。

解决方法

对于1.,我找到了正确的答案: 为了重用已准备好的语句,用户必须通过调用SQLFetch直到SQL_NO_DATA_FOUND来完成对结果代码的处理,或者(通过正确的方式)通过调用SQLFreeStmt(hstmt,SQL_CLOSE)来完成结果代码的处理。 SQLFreeStmt将释放与最新SQLExecute关联的隐式游标,并使语句可重复使用。