在private void save()
{
                            conn.Open();
SqlTransaction SaveNewList=obj1.BeginTransaction() ;
SqlCommand cmd = new SqlCommand () ;
cmd.Connection  = conn ;
cmd.Transaction = SaveNewList;
                   try{
 string sql="insert into list_head(program,play_date,writer,add_date)"+
"values('"+Program+"','"+PlayDate.ToString()+"','"+Writer+"','"+AddDate+"')";

cmd.CommandText = sql ;
cmd.ExecuteNonQuery ();
} //
//启动事务
//
SaveNewList.Commit();

}
catch(Exception ex)
{
SaveNewList.Rollback(); // 有异常则取消全部操作,回滚事务。
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}
在另一个函数中private void delete()
{
                        conn.Open();
SqlTransaction deleteList=obj1.BeginTransaction() ;
SqlCommand cmd= new SqlCommand () ;

    cmd.Connection=obj1;
cmd.Transaction =deleteList;
          try
{
string sqlIsExit="select * from list_pick where list_id='"+ID+"' and ns_id='"+_nsId[i]+"'";
DataSet ds= new DataSet () ;

SqlDataAdapter sd= new SqlDataAdapter (sqlIsExit,obj1 );

sd.Fill (ds);
if(ds.Tables[0].Rows.Count!=0)
{
string sql3="update ns_head set picked_num=picked_num-1 where ns_id='"+_nsId[i]+"'";
cmd.CommandText = sql3;
cmd.ExecuteNonQuery ();
}
//
//启动事务
//
deleteList.Commit();}
}
catch(Exception ex)
{
deleteList.Rollback(); // 有异常则取消全部操作,回滚事务。
MessageBox.Show(ex.ToString());
}
finally
{
obj1.Close();
}}单独执行两个函数没有问题,当两个函数同时执行的时候,在sd.Fill (ds);行提示当分配给命令的连接处于挂起的本地事务时,命令必须具有事务对象才能执行,该命令的Transaction属性未初始化。
是哪里的问题呀?

解决方案 »

  1.   

    在sd.Fill (ds);前加上 sd.SelectCommand.Transaction =deleteList;
      

  2.   

    当然会出现这个问题:
    同一个事物要关联的同一个连接对象;当你调用第一个函数后,你的事务就提交了,而且你的连接对象就关闭了(conn.Close();) 连接关闭后,与该连接对象关联的事务当然也结束了。 可以这样写:
    public class Session
    {
        public Session(SqlConnection connection)
        {
            this._conn = connection;
        }
        public SqlTransaction Open()
        {
           try{ this._conn.Open(); SqlTransaction tran = this._conn.BeginTransaction();}
           catch { if( this._conn != null ) this._conn.Close(); throw; }
        }
       
        public void Close()
        {
           if( this._conn != null ) this._conn.Close();
        }    private SqlConnection _conn;
    }public class Demo
    {
    // 改写你的2个函数
    private void save(SqlTransaction tran)
    {
       SqlCommand cmd = new SqlCommand () ;
       cmd.Connection  = tran.Connection;
       cmd.Transaction = tran;
       //...
       cmd.ExecuteNonQuery ();
       //在这里不要提交事务,不要关闭连接
     }
    private void delete(SqlTransaction tran)
    {
       SqlCommand cmd = new SqlCommand () ;
       cmd.Connection  = tran.Connection;
       cmd.Transaction = tran;
       //...
       cmd.ExecuteNonQuery ();
       //在这里不要提交事务,不要关闭连接
    }public void TranTest()
    {
       Session mySession  = new Session( new SqlConnection(...) );
       SqlTranaction tran = null ;mySesson.Open();
       try
       { 
         tran = mySesson.Open(); 
         this.Save( tran ); 
         this.Delete( tran ); 
         tran.Commit(); 
       }
       catch
       {
           if( tran != null ) tran.Rollback();
           throw;
       }
      finally {mySession.Close();}
    }
    }
      

  3.   

    多写了一句话:SqlTranaction tran = null ;mySesson.Open(); 去掉:mySesson.Open(); 这句代码