Informix 中 SQLEndTran 后如何保留 ODBC 游标?
结论
CURSORBEHAVIOR=1 需要由实际使用的 Informix ODBC 驱动从当前连接配置中读取并生效。仅凭 odbc.ini 中出现该项,无法确认游标会在事务结束后保留。请先确认配置位于连接实际使用的 DSN 中,再通过 ODBC 查询驱动报告的游标提交行为。如果驱动报告提交时会关闭或删除游标,调用 SQLEndTran 后就不能再对原语句调用 SQLFetch。此时需要让游标保持可用,或在事务结束后重新执行查询。
复现流程是在读取 tab1 的结果集后关闭自动提交,修改其他表,再调用 SQLEndTran。随后对原 hstmt 调用 SQLFetch 时返回 HY010,说明当前语句句柄的状态不允许执行这一步。这个错误无法单独证明 CURSORBEHAVIOR 配置没有生效,但与事务结束时游标被关闭的情况相符。
检查连接实际使用的配置
确认 CURSORBEHAVIOR=1 位于 SQLDriverConnect 实际连接到的 DSN 配置项中,并核对该选项是否适用于当前 Informix ODBC 驱动及其版本。修改配置后,断开旧连接并重新连接,再进行验证。不同驱动读取配置的方式可能不同。如果驱动文档允许,也可以在连接字符串中指定该选项,作为对照。
建立连接后,可以使用 SQLGetInfo 查询驱动报告的提交和回滚游标行为:
SQLUSMALLINT commitBehavior;
SQLUSMALLINT rollbackBehavior;
SQLGetInfo(hdbc, SQL_CURSOR_COMMIT_BEHAVIOR,
&commitBehavior, sizeof(commitBehavior), NULL);
SQLGetInfo(hdbc, SQL_CURSOR_ROLLBACK_BEHAVIOR,
&rollbackBehavior, sizeof(rollbackBehavior), NULL);
检查返回值是否为 SQL_CB_PRESERVE。如果提交或回滚行为不是 SQL_CB_PRESERVE,当前连接就无法保证事务结束后游标仍可用。CURSORBEHAVIOR 与这些返回值的具体对应关系,应以正在使用的 Informix ODBC 驱动文档为准。
调整处理顺序
如果驱动不支持保留游标,可以在事务结束后重新执行查询,再继续读取结果集。如果必须保留原结果集,则需要使用支持保留游标的驱动配置,并确认提交和回滚时的行为都符合需求。
示例在执行查询并读取几行后才关闭自动提交。为便于确认事务边界和驱动行为,建议在执行查询前设置自动提交模式,并分别检查提交、回滚和恢复读取的结果。如果 SQLGetInfo 显示游标可保留,但问题仍然存在,请检查 SQLSetConnectAttr、SQLEndTran 和 SQLFetch 的返回码及诊断信息,确认具体失败步骤和连接状态。
注意事项
提交和回滚后的游标行为可能不同,因此不能仅凭 CURSORBEHAVIOR=1 推断两者都会保留。代码片段没有提供驱动名称、版本或诊断记录,现有信息不足以确定 CURSORBEHAVIOR=1 未生效的具体原因。请结合当前连接查询到的 SQLGetInfo 结果和对应驱动文档继续排查。
备注:内容仅供参考。
