我的系统分成了DBU数据操作 DAL 以及BLL
现在问题是是BLL中要实现一个功能,例如
1 向A表插入一条数据
2 更具插入的数据查询B,C中相关字段
3 更具A,B,C相关数据,向D表中插入记录
这是一个业务,问题在于,这个必须在一个事务中实现,在创建DAL时,都是一张表一个类,每个类实现的插入都是一个独立事务,那么我要实现上面的功能,只能直接使用DBU来实现了,但这又违反了BLL不能直接访问DBU的规则
或者直接用DAL来实现,那么又违反DAL是不处理业务的,
这个功能到底应该如何来实现,在那里实现

解决方案 »

  1.   

    你的DAL必须支持不带事务的插入,在BLL里去设置启动和提交事务,
    实际上 你插入和更新单个表根本就无需事务。
      

  2.   

    直接DAL里面写事务不行?或者BLL新建特殊类处理特殊业务逻辑
      

  3.   


    这个是正解,三层架构事务就应该移到BLL中
      

  4.   


    BLL启动事物,把当前事物作为参数传给DAL,捕获DAL异常,若有rollback,无Commit或者直接存储过程
      

  5.   

    要执行的SQL语句放在ArrayList 数组里,然后一起提交就行了        /// <summary>
            /// 执行多条SQL语句,实现数据库事务。
            /// </summary>
            /// <param name="SQLStringList">多条SQL语句</param>
            public int OraExeSqlTran(ArrayList SQLStringList)
            {
                using (OracleConnection conn = new OracleConnection(OraConnStr()))
                {
                    conn.Open();
                    OracleCommand cmd = new OracleCommand();
                    cmd.Connection = conn;
                    OracleTransaction Tran = conn.BeginTransaction();
                    cmd.Transaction = Tran;
                    int Exint = -1;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n].ToString();
                        if (strsql.Trim().Length > 1)
                        {
                            try
                            {
                                cmd.CommandText = strsql;
                                cmd.ExecuteNonQuery();
                                Exint = 1;
                            }
                            catch (Exception er)
                            {
                                //ErrorRecord(strsql, er);
                                Exint = 0;
                                MsgError(er.Message.ToString());
                                break;
                            }
                        }
                    }
                    if (Exint == 1)
                    {
                        Tran.Commit();
                        SQLStringList.Clear();
                        return 1;
                    }
                    else
                    {
                        Tran.Rollback();
                        conn.Close();
                        SQLStringList.Clear();
                        return 0;
                    }
                }
            }
      

  6.   

    加入我直接采用存储过程了,那么是DAL先封装好,让后BLL在调用,还是直接BLL调用了
      

  7.   

    加入我直接采用存储过程了,那么是DAL先封装好,让后BLL在调用,还是直接BLL调用了
      

  8.   

    bll始终不能直接接触数据库的,当然是dal了