一、先描述一下系统结构:
DBUtility
   SQLHelper.cs
Model
BLL
IBLL
SQLServerDAL
OracleDAL //新增加的
IDAL
Factory
   DALFaceory.cs
   BLLFaceory.cs
WebOA
WebShop
WebSiteSQLHelper中是各种的数据库操作方法,都是使用后就关闭了数据库连接;二、开发现状
在需要使用到数据库事务时,都是使用存储过程实现(图个方便)。三:新需求
需要同时使用Oracle,并且需要事务处理;四:暂时想到的解决方式
1.在BLL中直接写事务和SQL;我认为这会增加维护成本,您认为呢?
2.修改DAL(在每一个需要事务处理的方法中);
  并在SQLHelper中增加一个public static int ExecTran(List<...的方法;
3.个人认为更加麻烦的一种方式:
  3.1:SQLHelper中增加GetConn(),CloseConn(),开始事务(String 名称),执行事务(String 名称),四种方法;
  3.2:各项DAL层中的各方法,比如ADD(),多写一个方法public ADD(SqlConnection conn,SqlTransaction tx,...){.....}
  3.3:BLL中打开连接,开启事务,再执行各个DAL中的相应方法(传入连接和事务参数),最后执行事务,关闭连接;
  
四:问题
1、请评价一下以上各方式的可行性、各自优缺;
2、现在的情况下,您有什么建议?
3、如果新的工程,一开始就考虑到了这种情况,应该使用什么样的架构设计?
谢谢!  

解决方案 »

  1.   

    你的意思是不是说一个操作要操作MSSQL还要操作Oracle.
    http://www.cnblogs.com/a311300/articles/1278448.html
    这里是讲的混合事务,你看下LZ.
      

  2.   

    多谢楼上的朋友。
    不过我不是要执行事务的代码。
    我想要解决这个问题比较好的思路。
    比如:你给的代码。如果在工厂模式中,应该在什么地方调用事务?BLL Or DAL
    就以单个SQL server 数据库说个简单的例子:四个表,table1,table2,table3,table4;table1DAL,table2DAL,table3DAL ,table4DAL
    这四个DAL封装四个表的操作,分别有:ADD(),Update(Model model),Delete(int ID),GetList(int id),GetData(int ID);如果没有使用事务就是这样子的:
    1:写入table3
      table3DAL.Add();2:更新table2
      Model.table2 model=  new Model.table2();
      model.ID = table3DAL.GetData(ID).TID;//按刚刚插入的table3的TID字段
      model.Name =  ****
      ......
      table2DAL.Update(model);3:读取table1的List
      IList<Model.table1> List = table1DAL.GetList(model.ID);//按刚刚更新的表2的ID字段
      
    4:批量写入table4
      for (...List ...){
        table4DAL.Add();
      }实际上比这个复杂得多,一般同时都得操作5个表以上。
    有读取单条记录的,有插入一条记录的,有读取List的,有批量插入的,还有删除的。
      

  3.   

    把操作数据库写接口,通过继承接口,写SQL操作类,oracle操作类。通过工厂模式实现
      

  4.   

    想不到一个技巧类的解决方案;
    大家点评一下。在DAL和SQLHelper之间加一个代理层,比如类名叫做TranClass;public clss TranClass:ITranClass{
       建立事务的实例......
    }SQLHelper中,如果TranClass事务建立,就按事务方式执行;
      

  5.   

    回头看了一下java中ibatis,原来带这个处理机制
      

  6.   

    iBatis.net可以实现
    在IBatis的Interface中定义好,然后事务放在service中,从而完成你要的数据操作,前面需要的操作就直接从service中调用