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を削除すると動作します。
ありがとうございました。 – cdonner
ありがとうございます。これは、私が直面した問題を解決するのに役立ちました。しかし、私はこの問題がなぜ発生するのか分かりません。 – Phil
@ Phil:GridViewは、トランザクションがコミットされた後でも、トランザクションのスコープ内にある間にバインドされています。エラーメッセージは、「これはトランザクション内に入れますが、すでにトランザクションをコミットしているため実行できません」というメッセージが表示されます。 GridViewをバインドするためにトランザクションは不要なので、トランザクションスコープからトランザクションを分離することは理にかなっています。 –