2009-09-17 14 views
9

Gridviewから送信されたイベントでカスケード削除を実行しています。削除はトランザクション内にあります。ここでは単純化されたコードは次のとおりです。エラーバインディングGridview: "現在のTransactionScopeは既に完了しています"

protected void btnDeleteUser_Click(object sender, EventArgs e) 
{ 
    DataContext db; 
    db = new DataContext(); 

    using (TransactionScope ts = new TransactionScope()) 
    { 
     try 
     { 
      //delete some data 
      db.SubmitChanges(); 

      ts.Complete(); 
     } 
     catch (Exception ex) 
     { 
      // handle error 
     } 
     finally 
     { 
      db.Dispose(); 
      BindGridView(); 
     } 
    } 
} 


private void BindGridView() 
{ 
    DataContext db; 

    db = new DataContext(); 

    GridView.DataSource = <my query> 

    GridView.DataBind();  <========Exception 

    db.Dispose(); 
} 

への呼び出しは、グリッドのDataBindを()メソッドは、この例外で失敗します 「現在のTransactionScopeはすでに完了しています。」 なぜですか?

もちろん、その時点でTransactionScopeが完了している必要があります。 TransactionScopeを削除すると動作します。

答えて

11

BindGridView()をトランザクションスコープ外に移動します。

using (TransactionScope ts = new TransactionScope()) 
    { 
     try 
     { 
      //delete some data 
      db.SubmitChanges(); 

      ts.Complete(); 
     } 
     catch (Exception ex) 
     { 
      // handle error 
     } 
     finally 
     { 
      db.Dispose(); 
     } 
    } 
    BindGridView(); 
+0

ありがとうございました。 – cdonner

+1

ありがとうございます。これは、私が直面した問題を解決するのに役立ちました。しかし、私はこの問題がなぜ発生するのか分かりません。 – Phil

+10

@ Phil:GridViewは、トランザクションがコミットされた後でも、トランザクションのスコープ内にある間にバインドされています。エラーメッセージは、「これはトランザクション内に入れますが、すでにトランザクションをコミットしているため実行できません」というメッセージが表示されます。 GridViewをバインドするためにトランザクションは不要なので、トランザクションスコープからトランザクションを分離することは理にかなっています。 –

関連する問題