0

我有一个在 COM+ 中运行的方法,它看起来有点像以下:

[AutoComplete(true)]
public bool DoSomething(string args)
{
    DoSomeDBWork(args);
    try {
        DBAccess.RunQuery("INSERT fail");
        return 0;
    }
    catch (Exception ex)
    {
        //Hide the error because it doesnt matter - log it out though for completeness
        DBAccess.RunQuery("INSERT INTO Log VALUES ('{0}')", ex.ToString());
        return -1
    }
}

OK 所以方法运行,DoSomeDBWork() 方法运行,对数据库进行一些更新。

“插入失败”运行,但失败。我只想忽略它,但注销它已失败。

但是我收到了一个错误:System.Transactions.TransactionException:该操作对事务的状态无效。

我假设即使我捕获了异常,因为它是一个数据库错误,它会自动回滚事务。
该错误来自“插入日志...”行
,并且在 DoSomeDBWork() 中更新的所有内容也都被回滚。

如何忽略失败的行?

4

1 回答 1

1

在尝试插入日志之前,您必须回滚用于“插入失败...”的事务 。不熟悉 DBAccess 及其工作原理,但是一旦您回滚,您应该能够隐式或显式地启动一个新事务。

[AutoComplete(true)]
public bool DoSomething(string args)
{
    DoSomeDBWork(args);
    try {
        DBAccess.RunQuery("INSERT fail");
        return 0;
    }
    catch (Exception ex)
    {
        DBAccess.Rollback();
        DBAccess.RunQuery("INSERT INTO Log VALUES ('{0}')", ex.ToString());
        return -1
    }
}
于 2013-03-11T12:18:52.160 回答