错误:SqlTransaction已完成

时间:2014-05-29 14:40:33

标签: c# sql transactions

代码:

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已经完成;它不再可用。 我尝试了cmd对象的关闭befor transaction.commit因为已经打开的连接错误! 如何在事务中使用这三个命令文本而不会出错!

2 个答案:

答案 0 :(得分:0)

您经常打开和关闭连接方式:

objCon.con.Open();
...
cmd1.Connection = objCon.con;
cmd1.Connection.Open();

不需要第二个OpenClose之后ExecuteNonQuery也不需要。{/ p>

基本上,您尝试在执行每个命令之前重新打开连接,然后再关闭它。

您还在catch子句中关闭了一次连接,然后再次在finally子句中关闭连接。

除了最后一个Open以外,除了最后一个Close之外,除掉所有{{1}}。

答案 1 :(得分:0)

SQL事务对连接有效。关闭连接后,您将提交或回滚该事务。在交易的整个生命周期中保持连接打开。基本上你需要这样做:

open connection
    start transaction
    command 1
    command 2
    ...
    command n
    commit transaction
close connection