2012-12-19 12 views
9

私は2つのテーブルのお問い合わせと詳細を持っています。私はロールバックでC#

fbsave(); 
fbsavedetails(); 
を書かれているボタンをクリックして保存し

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

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

は可能ですか?

+0

MS AccessまたはSQL Serverのように構成する必要がありますか? – andy

+2

どのようにデータレイヤーを作成しますか?ストアドプロシージャ? linq-to-sql?接続?切断された? –

+0

トランザクションを使用して、必要な処理を行うことができます。http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer

答えて

8
あなたが明示的にトランザクションを作成し、それを渡す必要があるので、なぜここにあなたが 必見は、各コマンドの Transaction設定

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

注、すなわち、その周りに渡すことができ

、およびすべてのコマンドは同じ接続オブジェクトになければなりません。


または、TransactionScopeを使用できます。

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

か::TransactionScopeアプローチで

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

、あなたは特別な何かを設定する必要はありません - のほとんどはOpen()自動入隊を取得するためにTransactionScope内に起こることが重要ですそれは自動です。もちろん、オプションで接続をメソッドに渡すこともできますが、独自の接続を取得することもできます。ほとんどの場合、正常に動作します。

+0

「自動入会を得るためにTransactionScopeを開いていますか?」はDTCの必要性を否定しますか? –

+0

@MrMooseいいえ、通常は接続を渡すだけでDTCの必要性を回避することができます:もしTransactionMode内で1つの接続オブジェクトを使用すると、DTCではなくLTMによって処理されます(すべてのバージョンSQL Server 2005年版、IIRC) –

7

TransactionScopeを使用できます。

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

トランザクションスコープを完了しないと、ロールバックされます。

1

  1. 使用DbTransactionこの問題を解決し、エラーが 両論が起こった場合の成功とロールバック場合、トランザクションをコミットし、2つの方法の周りDbTransactionを渡すには、2つの方法があります:DbTransactionは周り渡す必要が。
  2. 使用のTransactionScope 賛否: 両論使用することを容易:アクセスがサポートされていないが、データベースがSQL2000であれば、MSDTCが