我的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来做这件事。为什么总是被抓住?
谢谢!
答案 0 :(得分:2)
您必须提交交易sqlTran.Commit();
。
另外,将MyCommand.Transaction = sqlTran;
设为@juharr指出
答案 1 :(得分:1)
问题是缺少事务提交并为命令设置事务。这是我如何用连接,事务和命令的using
语句来确保事务被回滚,并且在异常的情况下关闭连接而不必显式调用{ {1}}或Rollback
。执行命令后必须调用Close
。通过从连接创建命令,您不必设置连接,但我认为您仍然必须设置事务。如果您不需要显示弹出框的try-catch,这可以进一步简化。
Commit