我现在在做一个半成品OA系统,发现前面的人同时处理多张数据库的表时是这样的:
    
    //插入合同信息;counts,返回的是最新插入的主键ID值
        int counts = helper.AddNew(info);
        string text = this.listvalue.Value.ToString();
        if (text != "" && text != null)
        {
            text = text.Substring(0, this.listvalue.Value.ToString().Length - 1);
            string[] text1 = text.Split('@');
            //合同明细
            List<Tb_HTMXInfo> list = new List<Tb_HTMXInfo>();
            foreach (string str in text1)
            {
                //依次插入合同明细
                Tb_HTMXInfo materId = new Tb_HTMXInfo();
                string[] str2 = str.Split(',');
                //物品名称
                materId.Hm_HyType = str2[0].ToString();//行业类型ID
                materId.Hm_CpName = str2[1].ToString();
       后面还有:
       //如果合同和合同明细都插入成功,则提示操作成功
        if (counts > 0 & result == true)
        {
            Response.Write("<script>alert('操作成功!');location.href='../main.aspx'</script>");
        }
        else
        {
            Response.Write("<script>alert('操作失败!')</script>");
        }
       我看到这代码很是来火,这事糊弄谁呢?尼玛多张表数据操作,居然不用事物处理!虽然我是菜鸟,但起码我不会这么做。我想把这个问题纠正过来,可是事务处理我用的不太熟悉,更别说改别人的代码。分布式事物处理?好像记得有个方法,是在数据访问层的方法里面创建一个事物对象,其它关联的地方去引用这个食物对象,但是我忘记了具体操作,求哪位高手帮个忙,给个具体的解决方案。正在头痛中...

解决方案 »

  1.   


    SqlConnection conn = new SqlConnection(“...”);
                    conn.Open();
                    //开启事务   
                    SqlTransaction sqlTransaction = conn.BeginTransaction();                //   将事务应用于Command   
                    SqlCommand sqlCommand = new SqlCommand();
                    sqlCommand.Connection = conn;
                    sqlCommand.Transaction = sqlTransaction;
    try{
    ...
    //成功提交   
     sqlTransaction.Commit();
    }catch (Exception)
                    {
                        //出错回滚   
                        sqlTransaction.Rollback();
                        conn.Close();
                        conn.Dispose();
                    }
      

  2.   

    SqlConnection conn = new SqlConnection("...");
    conn.Open();
    //开启事务   
    SqlTransaction sqlTransaction = conn.BeginTransaction();
    //将事务应用于Command   
    SqlCommand sqlCommand = new SqlCommand();
    sqlCommand.Connection = conn;
    sqlCommand.Transaction = sqlTransaction;
    try{
      sqlCommand.CommandText="....";//要执行的SQL
      sqlCommand.ExecNonQuery();
      sqlCommand.CommandText = "...";//要执行的SQL2
      ....
      //成功提交   
     sqlTransaction.Commit();
    }catch (Exception)
    {
      //出错回滚   
      sqlTransaction.Rollback();
                      
    }
    finally
    {
          conn.Close();
          conn.Dispose();
    }
      

  3.   


    这个方法是不是将SqlConnection conn = new SqlConnection(“...”);
                    conn.Open();
                    //开启事务   
                    SqlTransaction sqlTransaction = conn.BeginTransaction();                //   将事务应用于Command   
                    SqlCommand sqlCommand = new SqlCommand();
                    sqlCommand.Connection = conn;
                    sqlCommand.Transaction = sqlTransaction;
    这段代码全部应用到DAO的方法里面去?就是所有的方法都加这段代码?然后try{...//这里面写每个对象自己的增加方法?还是增加的SQl(合同、合同明细的增加SQL)都放到这里面?}
      

  4.   

    这个方法我知道,但是这里用的不太实际,合同的明细不能确定有几条。他的方法好恶心,全部都是直接在页面创建对象然后引用Helper类增加方法,如果用这个方法,意味着我要把他的代码全部重写。
      

  5.   

    如果我将这个方法直接写在表示层的aspx.cs页面,可以么?
      

  6.   

    仅仅是一个建议 ,如果你的数据库引擎较好的 还是用sql来实现 procdure ,数据库压力大的话 还是建议用
    "1楼"的ado.net中的事务处理
      

  7.   

    connection 对象肯定不能这么获取,但是需要用单例模式封住数据访问类。
    在cs类访问数据访问类对象是可以的。
      

  8.   

    可以使用 TransactionScope
    http://www.cnblogs.com/blsong/archive/2010/08/13/1798987.html