如何使用Windows ODBC

时间:2016-02-10 20:04:29

标签: sql sql-server windows transactions odbc

如何使用Microsoft Windows ODBC API手动提交/回滚事务?如果重要,查询的SQL服务器是MS SQL Server。语言是C ++。

我需要在单个事务中包含对SQLExecDirect的多次调用,以保证一致性。执行的查询不使用任何事务。

伪代码:

// Begin Transaction?
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLEndTran(...);

我的方法是首先禁用自动提交,如TechNet所述:

SQLSetConnectAttr(m_hConnection, SQL_ATTR_AUTOCOMMIT, (void*) SQL_AUTOCOMMIT_OFF, 0);

运行我的查询,然后提交/回滚:

SQLEndTran(SQL_HANDLE_DBC, m_hConnection, SQL_COMMIT);

它没有给出任何错误,但似乎没有做到这一点。如果我使用MS SQL Management Studio检查事务日志,则所有内容都显示为implicit_transaction(好),仅跨越一个操作(不是)。

SSMS Output

使用自己的Statement句柄每次调用SQLExecDirect会导致此问题吗?我正在考虑这个问题,我可以尝试改变它,但这是一项非常重要的任务,因为可能

而不愿意这样做。

另一方面,我不知道如何进一步调试。如果有人有任何想法,我会非常感激。

1 个答案:

答案 0 :(得分:1)

这与我通常做的非常相似。 SQLSetConnectAttr中的一些区别:

  1. 我确实检查了返回值
  2. SQL_AUTOCOMMIT_OFF应该转换为SQLPOINTER
  3. 最后一个参数应该是SQL_IS_UINTEGER而不是0
  4. 其他一切对我来说似乎都不错......