日期:2014-05-18  浏览次数:20354 次

事务应用,请高手指教
类中有三个方法,分别通过参数执行SQL插入

怎么把这三个方法做到事务中,因为这三个插入是有关联的,一个不成功,都不成功


  public string AddOrderInfo(Conn cn, string p_strXml)
  {  
  try
  {
   
  AddOrder(conn,p_strXml);
  AddOrderSeg(conn,p_strXml);
  AddCuster(conn,p_strXml);
   
  }
  catch
  {
   
  }
  }
   

如果分配给命令的连接位于本地挂起事务中,ExecuteScalar 要求命令拥有事务。命令的 Transaction 属性尚未初始化。

public void AddOrder(SqlConnection cn, string p_strXml)
{
  //源码类似AddCuster方法
}

public void AddOrderSeg(SqlConnection cn, string p_strXml)
{
  //源码类似AddCuster方法
}

public void AddCuster(SqlConnection cn, string p_strXml)
{
  string strSql = "insert into bb_OrderCusts (numOrderId,vcPerName,vcIdentCardNo) values (@numOrderId,@vcPerName,@vcIdentCardNo)";
  SqlCommand cmd = new SqlCommand(strSql, cn);
  cmd.Parameters.Add("@numOrderId", SqlDbType.Int).Value = Convert.ToInt32(iid);
  cmd.Parameters.Add("@vcPerName", SqlDbType.VarChar).Value = np.FindTextByPath("//eg/Custer/rec/PerName");
  cmd.Parameters.Add("@vcIdentCardNo", SqlDbType.VarChar).Value = np.FindTextByPath("//eg/Custer/rec/IdentCardNo");
  cmd.ExecuteNonQuery();  
}

------解决方案--------------------
用存储过程的事务多方便呀
------解决方案--------------------
C# code
        public string AddOrderInfo(Conn cn, string p_strXml) 
        {  
              try 
              { 
                  using(TransactionScope scope=new TransactionScope ())
                  {
                     AddOrder(conn,p_strXml); 
                     AddOrderSeg(conn,p_strXml); 
                     AddCuster(conn,p_strXml); 
                  }
              } 
              catch 
              { 
                
              } 
        }