9

2 つのテーブルの問い合わせと詳細があります。保存ボタンをクリックすると、私は書いた

fbsave();
fbsavedetails();

fbsave()照会テーブルにデータをfbsavedetails()保存し、詳細テーブルにデータを保存します。

fbsavedetails() でエラーが発生した場合は、両方の手順をロールバックする必要があります。

出来ますか?

4

3 に答える 3

8

トランザクションを明示的に作成し、それを渡すことができます。

using(var connection = ...)
{
    connection.Open();
    using (var tran = connection.BeginTransaction())
    {
        try
        {
            FBSave(connection, tran);
            FBSaveDetails(connection, tran);
            tran.Commit();
        }
        catch
        {
            tran.Rollback();
            throw;
        }
    }
}

ここでは、各コマンドでも設定する必要Transactionがあることに注意してください。したがって、それを渡す必要がある理由と、すべてのコマンドが同じ接続オブジェクト上にある必要があります。


TransactionScopeまたは: ;を使用できます。自動登録を取得するには、内部Open()でが発生することが重要です。TransactionScope

using(var tran = new TransactionScope())
{
    FBSave();
    FBSaveDetails();
    tran.Complete();
}

また:

using(var tran = new TransactionScope())
using(var connection = ...)
{
    connection.Open();
    FBSave(connection);
    FBSaveDetails(connection);
    tran.Complete();
}

このTransactionScopeアプローチでは、特別なものを設定する必要はありません。そのほとんどは自動的に設定されます。もちろん、必要に応じて接続をメソッドに渡すこともできますが、独自の接続を取得することもでき、ほとんどの場合は問題なく動作します。

于 2012-12-19T07:18:46.570 に答える
7

トランザクションスコープを使用できます。

using(var scope = new TransactionScope())
{
   //Complete the transaction only when both inserts succeed. 
   scope.Complete();
}

transactionscope を完了しないと、ロールバックされます。

于 2012-12-19T07:19:22.623 に答える
1

この問題を解決するには2つの方法があります

  1. DbTransactionを使用して、2つのメソッドの周りにDbTransactionを渡し、成功した場合はトランザクションをコミットし、エラーが発生した場合はロールバックします。短所:DbTransactionを渡す必要があります。
  2. TransactionScopeを使用する長所:使いやすさ短所:アクセスはサポートされていません。データベースがsql2000の場合、msdtcを構成する必要があります。
于 2012-12-19T07:26:37.897 に答える