【问题标题】:How to close the ADO connection if the database connection fails while inside a transaction如果在事务中数据库连接失败,如何关闭 ADO 连接
【发布时间】:2013-09-10 13:51:53
【问题描述】:

我正在通过 C++ 使用 ADO,假设我在连接断开时通过 ADO 开始了一个事务。

我希望放弃我的数据库更改并关闭我的 ADO 数据库连接对象,以便返回到另一个可以显示错误消息的代码模块(不让这个模块处于狡猾的状态)。

问题是:

1) 我无法关闭数据库连接,因为抛出错误 adErrInTransaction (0x800a0cae)(在事务中无法显式关闭连接对象)

2)我无法回滚事务,因为抛出了错误 0x8000ffff(灾难性故障,....连接失败)

这似乎是第 22 条问题。如果事务没有启动,那么在 ADO 连接上调用 Close 会成功,但不幸的是,在事务打开时,我似乎被卡住了!

是否是唯一的解决方案来记录它在事务中失败的事实,以便在恢复数据库连接时,我可以在尝试其他任何操作之前完成回滚?

如果相关的话,这已使用 SQLServer 2008 进行了测试,但我并不真正想要特定于 SQLServer 的解决方案。

【问题讨论】:

    标签: c++ transactions database-connection ado rollback


    【解决方案1】:

    嗯,好久没这么做了,但是:

    1) 您必须使用db.BeginTransaction(); 而不是BEGIN TRANSACTION (http://support.microsoft.com/kb/198024/en-us) 开始交易

    2) 当您发现连接中断时,只需终止事务 通过:

    SqlConnection db = new SqlConnection("ado...");
    SqlTransaction transaction;
    
    db.Open();
    transaction = db.BeginTransaction();
    //..........
    // stuff here 
    //..........
    if ( connGone ) {
    transaction.rollback();
    db.close(); }
    

    【讨论】:

    • 谢谢@Najzero,我很想知道这行得通。不幸的是,由于代码必须支持 Oracle 和 SQLServer,调用实际上是使用 ADODB::_ConnectionPtr,调用 BeginTrans 方法,据我所知,该方法返回事务级别。我不知道有 ADODB::TransactionPtr 这样的东西,所以也许这不可能通过 ADO。不过感谢您的提示,我会看看您的链接。
    • 谢谢,这解决了我的未知异常问题。我曾打电话给 BeginTransaction。即使它从未命中数据库,连接也需要在我关闭数据库连接之前调用回滚。
    • 在 JScript 中,with (db) { some ops } 抛出连接失败异常。没有with,不会抛出异常。
    猜你喜欢
    • 2016-12-05
    • 2016-06-22
    • 1970-01-01
    • 2015-02-11
    • 2020-12-24
    • 2011-02-03
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多