13

Gridview から送信されたイベントでカスケード削除を行っています。削除はトランザクション内にあります。簡略化されたコードは次のとおりです。

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 を削除すると、機能します。

4

1 に答える 1

17

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

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

            ts.Complete();
        }
        catch (Exception ex)
        {
            // handle error
        }
        finally
        {
            db.Dispose();
        }
    }
    BindGridView();
于 2009-09-17T03:57:28.177 に答える