【问题标题】:How do i perform manual transactions with Windows ODBC如何使用 Windows ODBC 执行手动事务
【发布时间】:2016-05-21 08:57:00
【问题描述】:

应该如何使用 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(好的),只跨越一个操作(不好)。

这个问题可能是由于每次调用SQLExecDirect 都使用自己的语句句柄造成的吗?我正在考虑这一点,我可以尝试改变它,但这将是一项我不愿意做的任务,因为它可能是。

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

【问题讨论】:

    标签: sql sql-server windows transactions odbc


    【解决方案1】:

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

    1. 我会检查返回值
    2. SQL_AUTOCOMMIT_OFF 应该被强制转换为 SQLPOINTER
    3. 最后一个参数应该是 SQL_IS_UINTEGER 而不是 0

    在我看来,其他一切都还可以......

    【讨论】:

    • 我在帖子中省略了返回值检查,当然我这样做了..没有返回错误。它是 SQL_SUCCESS。不过要试试其他的,谢谢。 SQL_IS_UINTEGER 可能是关键,因为它的值是 -5 而不是 0。
    • 就是这样。谢谢!
    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多