SQL事务总是被捕获

本文关键字:事务 SQL | 更新日期: 2023-09-27 18:26:50

我的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的正确方式吗?我遵循了微软网站上的指南来做这件事。为什么它总是被抓住?

谢谢!

SQL事务总是被捕获

您必须提交事务sqlTran.Commit();

此外,将MyCommand.Transaction = sqlTran;设置为@juharr指出的

问题是缺少事务提交和为命令设置事务。以下是我对connect、transaction和命令的using语句的处理方法,这些语句将确保在发生异常时回滚事务并关闭连接,而不必显式调用RollbackClose。在执行命令之后必须调用Commit。通过从连接创建命令,您不必设置连接,但我认为您仍然需要设置事务。如果你不需要显示弹出框的try-catch,这可以进一步简化。

protected void editDelete(object sender, DirectEventArgs e)
{
    using (
        var MyConnection =
            new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
    {
        MyConnection.Open();
        // Start a local transaction.
        using (var sqlTran = MyConnection.BeginTransaction())
        {
            try
            {
                using(var MyCommand = MyConnection.CreateCommand())
                {
                    MyCommand.CommandText = /* 3 queries removed to shorten code */;
                    MyCommand.CommandType = CommandType.Text;
                    MyCommand.Transaction = sqlTran;
                    SqlParameter p1 = new SqlParameter("@id", this.accountidEdit.Value);
                    MyCommand.Parameters.Add(p1);
                    MyCommand.ExecuteNonQuery();
                    sqlTran.Commit();
                }

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