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()メソッドが実行され、DBに対していくつかの更新が行われます。

'insert fail'が実行され、失敗します。無視したいのですが、失敗したのでログアウトしてください。

しかし、エラーが生成されます:System.Transactions.TransactionException:操作はトランザクションの状態に対して無効です。

例外をキャッチしても、DBエラーであるため、トランザクションが自動的にロールバックされていると思います。
エラーは「ログに挿入...」の行から発生し
、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 に答える