有两个表一个合计,一个明细表
                       con.Open();
                    cmd = new SqlCommand();
                    cmd.Connection = con;
                    SqlTransaction tx = con.BeginTransaction(); //事务开始
                    cmd.Transaction = tx;
                    try
                    {                        
                        for (int i = 0; i < sqlstr.Length ; i++)
                        {
                            string strsql = sqlstr [i];
                            if (strsql.Trim().Length > 1)
                            {
                                cmd.CommandText = strsql;  //这一句插入合计表
                                cmd.ExecuteNonQuery();
                                apdate.Update((DataTable)bindingSource1.DataSource)  //这一句插入明细表(datagridview数据)
                            }
                        }
                        tx.Commit();
                        MessageBox.Show("成功");
                        OnGjxg();
                        this.Close();
                    }
                    catch
                    {
                        tx.Rollback();
                        MessageBox.Show("运行错误");     
                    }这样的代码行吗?
不行有什么方法?

解决方案 »

  1.   

    有两个表一个合计,一个明细表    代码是这样
                           con.Open(); 
                        cmd = new SqlCommand(); 
                        cmd.Connection = con; 
                        SqlTransaction tx = con.BeginTransaction(); //事务开始 
                           cmd.Transaction = tx; 
                        try 
                        {                      
                          
                                cmd.CommandText = strsql;  //这一句插入合计表 
                                    cmd.ExecuteNonQuery(); 
                                apdate.Update((DataTable)bindingSource1.DataSource)  //这一句插入明细表(datagridview数据) 
                           
                            tx.Commit(); 
                            MessageBox.Show("成功"); 
                            this.Close(); 
                        } 
                        catch 
                        { 
                            tx.Rollback(); 
                            MessageBox.Show("运行错误");    
                        } 这样的代码行吗? 
    不行有什么方法?
      

  2.   

    将tx.Commit(); 
    放在所有代码的最后执行
      

  3.   

    tx怎么传给apdate apdate.Transaction = tx; ?
      

  4.   

    在最后加个finally
    finally
    {
      if(conn!=null)
      {
          conn.close();
      }
    }
      

  5.   

    这样 apdate.UpdateCommand.Transaction = tx;?
      

  6.   

    这样 apdate.UpdateCommand.Transaction = tx;?
      

  7.   


    应该是的,我update直接用sql语句
    总之要传事务给连接开始事务后引用这个连接的的所有其它sql操作控件
      

  8.   

    apdate.UpdateCommand.Transaction = tx;
    提示未将对象引用到时实例
    因为我没有设置UpdateCommand字段
    有什么方法解决吗?
      

  9.   

    楼主:sqlstr [i]数组里存的什么,是SQL语句吧?
    你是用bindingsource控件和tableadapter控件将数据绑定到datagridview中的吧,还想用事务。我正为这事苦恼呢,用控件绑定数据就不知道如何用事务。
    用代码编写事务又不方便操作datagridview中的数据不知楼主的方法成功了吗?
      

  10.   


    using System.Data.SqlClient;
     2
     3protected void ExecMuliSQL()
     4{
     5DataTable dt = new DataTable();
     6 
     7SqlConnection cnn = new SqlConnection("连接字符串");
     8SqlCommand cm = new SqlCommand();
     9cm.Connection = cnn;
    10cnn.Open();
    11SqlTransaction trans = cnn.BeginTransaction();
    12//各步操作
    13try
    14{
    15foreach(DataRow dr in dt.Rows)
    16{
    17cm.CommandText = "update [库存表] set [库存数量] = @amount where productID = @productID";
    18cm.Parameters.Add("@amount",SqlDbType.Int);
    19cm.Parameters["@amount"].Value = Convert.ToInt32(dr["amount"]);
    20cm.Parameters.Add("@productID",SqlDbType.VarChar);
    21cm.Parameters["@productID"].Value = dr["productID"].ToString();
    22cm.ExecuteNonQuery();
    23}
    24trans.Commit();
    25}
    26catch
    27{
    28trans.Rollback();
    29}
    30finally
    31{
    32cnn.Close();
    33trans.Dispose();
    34cnn.Dispose();
    35}
    36}