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
的正确方式吗?我遵循了微软网站上的指南来做这件事。为什么它总是被抓住?
谢谢!
您必须提交事务sqlTran.Commit();
。
此外,将MyCommand.Transaction = sqlTran;
设置为@juharr指出的
问题是缺少事务提交和为命令设置事务。以下是我对connect、transaction和命令的using
语句的处理方法,这些语句将确保在发生异常时回滚事务并关闭连接,而不必显式调用Rollback
或Close
。在执行命令之后必须调用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();
}
}
}
}