1

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

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

问题是:

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

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

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

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

如果相关的话,这已经用 SQLServer 2008 进行了测试,尽管我真的不想要一个特定于 SQLServer 的解决方案。

4

1 回答 1

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(); }
于 2013-09-10T14:02:52.130 回答