10

いくつかのテーブルを同時に変換したいと思います。1つが成功しない場合は、すべてロールバックする必要があります。

そんな感じ:

ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall");
ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale");
ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale");
ctx.Database.ExecuteSqlCommand("truncate table tb_purchase");

しかし、問題は、これにトランザクションをどのように使用するかわかりません。

私はこれを試しています:

using (gasstationEntities ctx = new gasstationEntities(Resources.CONS))
{
    ctx.Database.Connection.Open();
    DbTransaction tr = ctx.Database.Connection.BeginTransaction();

    try
    {
        ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall");
        ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale");
        ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale");
        ctx.Database.ExecuteSqlCommand("truncate table tb_purchase");
        //commit the transaction
        tr.Commit();
        new MessageWindow(this, Resources.GetString("Warn"), Resources.GetString("DeleteSuccess"));
    }
    catch (Exception ex)
    {
        //return
        tr.Rollback();
    }
    //close
    ctx.Database.Connection.Close();
}

ここでの問題: tr.Commit(); そして例外は私に教えてくれます:

{System.InvalidOperationException: Connection must be valid and open to rollback transaction

そして、tr.Rollback();例外をスローします。例外は次のとおりです。

{System.InvalidOperationException: Connection must be valid and open to rollback transaction

本当に面白いのは、テーブルの切り捨ては成功です。何?コミットは例外をスローします。そしてそれは成功することができますか?理解できません。

何が起こっているのか教えてください。あなたが私に解決策を与えれば、それはさらに良いです。

4

2 に答える 2

23

への参照を追加しSystem.Transactions、インポートusing System.Transactions;してから、次の方法でコードをカプセル化してみてください

using (gasstationEntities ctx = new gasstationEntities(Resources.CONS))
{
   using (var scope = new TransactionScope())
   {
      [... your code...]

      scope.Complete();
   }
}

例外が発生した場合、scope.Complete()は呼び出されず、ロールバックは自動的に行われます。

編集: MySqlタグを見たところです。これが機能しない場合は、こちらをご覧ください。

于 2012-12-13T16:16:29.860 に答える
3

これを試してください。技術的には、usingは例外がないときにトランザクションをコミットする必要がありますが、例外の場合、usingは自動的にトランザクションをロールバックします。

using (var txn = new TransactionScope())
{
    ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall");
    ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale");
    ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale");
    ctx.Database.ExecuteSqlCommand("truncate table tb_purchase");
    txn.Complete();
}
new MessageWindow(this, Resources.GetString("Warn"), Resources.GetString("DeleteSuccess"));
于 2012-12-13T16:17:05.573 に答える