Tencent / 3TS

腾讯事务处理技术验证系统(Tencent Transaction Processing Testbed System)
Other
145 stars 53 forks source link

Fix SQLFreeStmt bug in sql_cntl(_v2).cc #30

Closed zzhuncle closed 1 year ago

zzhuncle commented 1 year ago

原始代码中连续使用了如下命令

SQLFreeStmt( m_hStatement, SQL_DROP);
SQLFreeStmt( m_hStatement, SQL_UNBIND);

我在测试mariadb数据库时在执行第二句代码时报错,ChatGPT给出的解释为

SQLFreeStmt 函数用于释放与一个语句相关联的所有资源。它接受两个参数:一个是语句句柄,另一个是一个操作选项。这些选项指定了应当释放哪些资源。

  1. SQL_DROP: 此选项表示释放语句句柄和与它相关联的所有资源。一旦你使用这个选项,这个语句句柄就不再是有效的,你不能再使用它进行其他操作。
  2. SQL_UNBIND: 此选项用于取消语句句柄上当前绑定的所有列的绑定。它通常在执行了一个查询后使用,当你想要解除列的绑定以准备下一个查询时。

问题出在你先使用了 SQL_DROP 释放了语句句柄,然后尝试用同一个已经被释放的句柄来调用 SQL_UNBIND。这是不允许的,因为在 SQL_DROP 之后,句柄已经不再有效。

如果你需要先解绑列,然后再释放句柄,你应该首先调用 SQL_UNBIND,然后再调用 SQL_DROP。但是,实际上,如果你要释放整个语句句柄,直接调用 SQL_DROP 就足够了,因为这会释放与该句柄关联的所有资源。

因此直接注释掉第二句即可解决问题。

另外,可以参考官方文档[SQLFreeStmt 函数 - ODBC API Reference | Microsoft Learn对SQLFreeStmt 函数进行理解。

zzhuncle commented 1 year ago

好的,改为先unbind再drop,测试mariadb和mysql都okay的