SQL事务总是被捕获

时间:2014-10-16 15:15:57

标签: c# asp.net .net transactions rollback

我的sql命令执行了3个delete个查询。只有在其他表中没有对它的引用时,才能执行三个查询中的最后一个。如果有引用,则无法执行。因此,如果最后一次删除失败,我希望rollback不会丢失将在前两个命令中删除的数据。这就是我需要使用SqlTransaction的原因。

以下是我能够想到的。它实际上可以防止丢失任何数据,但是,我无法删除任何内容并且总是获取弹出窗口(意味着每次执行时都会被捕获)。

protected void editDelete(object sender, DirectEventArgs e)
{
    SqlConnection MyConnection = new SqlConnection();
    MyConnection.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

    MyConnection.Open();

    // Start a local transaction.
    SqlTransaction sqlTran = MyConnection.BeginTransaction();

    try
    {
        SqlCommand MyCommand = new SqlCommand();
        MyCommand.CommandText = /* 3 queries removed to shorten code */;
        MyCommand.CommandType = CommandType.Text;
        MyCommand.Connection = MyConnection;

        SqlParameter p1 = new SqlParameter("@id", this.accountidEdit.Value);
        MyCommand.Parameters.Add(p1);

        MyCommand.ExecuteNonQuery();
        MyConnection.Close();


        /* reload and notification calls removed to shorten code */
    }
    catch (Exception)
    {
        sqlTran.Rollback();
        X.Msg.Alert("Error", "Error.").Show();
    }

}

此外,我尝试使用以下方法找到问题:

catch (Exception sqlexception)
    {
        Console.WriteLine(sqlexception.Message);
        sqlTran.Rollback();
        X.Msg.Alert("Error", "Error.").Show();
    }

但是没有任何东西写过控制台......很奇怪?

这是执行SqlTransaction的正确方法吗?我跟着a guide from the microsoft site来做这件事。为什么总是被抓住?

谢谢!

2 个答案:

答案 0 :(得分:2)

您必须提交交易sqlTran.Commit();

另外,将MyCommand.Transaction = sqlTran;设为@juharr指出

答案 1 :(得分:1)

问题是缺少事务提交并为命令设置事务。这是我如何用连接,事务和命令的using语句来确保事务被回滚,并且在异常的情况下关闭连接而不必显式调用{ {1}}或Rollback。执行命令后必须调用Close。通过从连接创建命令,您不必设置连接,但我认为您仍然必须设置事务。如果您不需要显示弹出框的try-catch,这可以进一步简化。

Commit