错误:SqlTransaction已完成
本文关键字:已完成 SqlTransaction 错误 | 更新日期: 2023-09-27 18:05:40
代码:
foreach (DataGridViewRow row1 in grdListKala.Rows)
{
if (grdListKala.Rows.Count == 0)
{
MessageBox.Show("Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
try
{
objCon.Connecting();
objCon.con.Open();
transaction=objCon.con.BeginTransaction();
//******************************************
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = objCon.con;
cmd1.Transaction = transaction;
cmd1.ExecuteNonQuery();
//******************
foreach (DataGridViewRow row2 in grdListKala.Rows)
{
SqlCommand cmd2 = new SqlCommand();
cmd2.Connection = objCon.con;
cmd2.Transaction = transaction;
cmd2.ExecuteNonQuery();
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = objCon.con;
cmd3.Transaction = transaction;
cmd3.ExecuteNonQuery();
}
transaction.Commit();
}
catch (Exception exp)
{
if (transaction != null)
transaction.Rollback();
}
finally
{
objCon.con.Close();
transaction.Dispose();
}
错误:这个SqlTransaction已经完成;它已经不能用了。我在transaction.commit之前尝试了CMD对象的关闭,因为连接已经打开了错误!我如何在事务中使用这三个命令文本而不出错!
SQL事务对于连接是有效的。一旦关闭连接,就可以提交或回滚该事务。在事务的生命周期内保持连接打开。基本上你需要这样做:
open connection
start transaction
command 1
command 2
...
command n
commit transaction
close connection
你打开和关闭连接的次数太频繁了:
objCon.con.Open();
...
cmd1.Connection = objCon.con;
cmd1.Connection.Open();
第二个Open
不需要,ExecuteNonQuery
之后的Close
也不需要。
基本上,你试图在执行每个命令之前重新打开连接,然后再次关闭它。
您还在catch
子句中关闭连接一次,然后在finally
子句中再次关闭连接。
去掉所有的Open
(除了第一个)和所有的Close
(除了最后一个)。