DAL中开启ado事务的思路!

cnidb 2009-03-20 05:03:32
一、先描述一下系统结构:
DBUtility
SQLHelper.cs
Model
BLL
IBLL
SQLServerDAL

OracleDAL //新增加的
IDAL
Factory

DALFaceory.cs
BLLFaceory.cs
WebOA
WebShop
WebSite


SQLHelper中是各种的数据库操作方法,都是使用后就关闭了数据库连接;

二、开发现状
在需要使用到数据库事务时,都是使用存储过程实现(图个方便)。

三:新需求
需要同时使用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、如果新的工程,一开始就考虑到了这种情况,应该使用什么样的架构设计?


谢谢!








...全文
250 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnidb 2009-03-20
  • 打赏
  • 举报
回复
多谢楼上的朋友。
不过我不是要执行事务的代码。
我想要解决这个问题比较好的思路。
比如:你给的代码。如果在工厂模式中,应该在什么地方调用事务?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的,有批量插入的,还有删除的。


sxmonsy 2009-03-20
  • 打赏
  • 举报
回复
你的意思是不是说一个操作要操作MSSQL还要操作Oracle.
http://www.cnblogs.com/a311300/articles/1278448.html
这里是讲的混合事务,你看下LZ.
EveryCase 2009-03-20
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~~
cnidb 2009-03-20
  • 打赏
  • 举报
回复
看到了,谢谢ls的帮助。

晚上好好研究一下。结贴先。。
avichen 2009-03-20
  • 打赏
  • 举报
回复
iBatis.net可以实现
在IBatis的Interface中定义好,然后事务放在service中,从而完成你要的数据操作,前面需要的操作就直接从service中调用
cnidb 2009-03-20
  • 打赏
  • 举报
回复
回头看了一下java中ibatis,原来带这个处理机制
cnidb 2009-03-20
  • 打赏
  • 举报
回复
想不到一个技巧类的解决方案;
大家点评一下。

在DAL和SQLHelper之间加一个代理层,比如类名叫做TranClass;

public clss TranClass:ITranClass{
建立事务的实例......
}

SQLHelper中,如果TranClass事务建立,就按事务方式执行;

cnidb 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
把操作数据库写接口,通过继承接口,写SQL操作类,oracle操作类。通过工厂模式实现

[/Quote]
和第3种方式类似?
天乐 2009-03-20
  • 打赏
  • 举报
回复
火速前来围观高手
wuyq11 2009-03-20
  • 打赏
  • 举报
回复
把操作数据库写接口,通过继承接口,写SQL操作类,oracle操作类。通过工厂模式实现

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧