如何解决C / C ++ ODBC SQLExec获取SQLSTATE 24000无效的游标状态
我试图利用可重用的预处理语句,仅从DB(SQLMX)提取1行。 我需要2个问题的帮助(其中1个已部分解决):
-
- 在这里,我知道问题出在哪里,但我不明白为什么会出问题或为什么要出解决方案。如果在得到SQL_NO_DATA_FOUND之前不调用SQLFetch,那么我的第二个SQLExecute将获得SQLCODE24000。为什么语句句柄要求我用SQLFetch完成整个结果集的处理,直到获得SQL_NO_DATA_FOUND?我想要的只是对1行进行SQLFetch,并使用新参数执行SQLExecute语句。是否存在一些隐式游标?如何摆脱游标而不重复调用SQLFetch?当我知道只需要返回一行时,如何避免隐式游标?
-
- 在循环中,每个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关联的隐式游标,并使语句可重复使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。