10

我想同时转写一些表。如果一个不成功,必须全部回滚。

像这样的东西:

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 (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 回答