如果在事务内部数据库连接失败,如何关闭ADO连接

时间:2013-09-10 13:51:54

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

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

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

问题是:

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

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

这似乎是一个陷阱22的情况。如果交易没有开始,那么在ADO连接上调用Close会成功,但不幸的是,当交易打开时,我似乎被卡住了!

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

如果它与SQLServer 2008相关,那么它是相关的,尽管我真的不想要特定于SQLServer的解决方案。

1 个答案:

答案 0 :(得分:2)

嗯,很久没有这样做了,但是:

1)您必须使用db.BeginTransaction();而不是BEGIN TRANSACTIONhttp://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(); }