.net的数据操作方法和实践实在是太多了,最根本的就是ADO.NET。微软提供了一些最佳实践,比如OracleHelper和企业库;同时也有大量的第三方的O/RMapping解决方案,比如:Hibernate,Castle等等,在asp.net2.0推出后,微软又提供了typed dataset和DataObjectSource的解决的数据存取方法。由于项目经验的限制,只使用过微软提供的解觉方案,没有使用过第三方的ORM来解决数据操作问题,linq等最新的数据存取方式在项目中还没有使用。所以只能说是本人的最佳实践。去年的.net项目用的OracleHelper仿照petshop搭建的项目框架,今年开始使用企业库来做数据操作,下面首先会根据我的经验比较一下OracleHelper和企业库以及DataObjectSource三中微软的解决方案,之后就数据操作的基本需求进行讨论,最后会讨存一下连接池和事务控制等高级需求。数据库是oracle,用sqlserver的朋友可能要稍微变化一下。
一、方案比较
ADO.NET一个很不方便的地方就是构造oraclecommand的构造,在以前一些实例教学的书上有很多小经验封装这块操作。petshop的推出后,有开发源代码的OracleHelper基础类,封装了很多冗余的数据操作,如果没有使用ORM工具,是一个不错的选择。使用model做为数据传输的类库,我个人觉的利用泛型的ILIST<MODEL>要比dataset更好用。利用vs编译器优势,简化了编程。
企业库是微软提供的最佳实践,除了数据访问块,还有日志,缓存,配置,异常等多个块,企业级应用中综合应用这些块可以解决很多基础架构问题。是非常不错的选择。
关于DataObjectSource,本来想用一下的,学习了webcast上的一个专题讲座并看了一本相关的书,后觉得这个技术有些象鸡肋,虽然强类型dataset自动生成增删改查,但是如果表结构发生修改后要要从新做。而且轻量级的项目我们可以选择OracleHelper,重量级的项目选择企业库,现在的代码生成器生成DAL层的代码也很方便,觉得这个技术的实用价值不大。
结论:轻量级的项目我们可以选择OracleHelper,重量级的项目选择企业库。企业库调用存储过程也比OracleHelper方便。
二、数据操作的需求的解决方法对比
最基础的操作需求是增删改查,衍生后的需求是:增加单条记录,批量增加多条记录,按照id删除,where条件删除(where条件可能不定),按照ID更新,where条件Update(where条件不定),不定条件的动态查询,分页查询。
还有些高级需求:连接池控制,cache处理,连接字符串的加密和保存,事务控制。
1.OracleHelper的解决之道
查询数据集OracleHelper.ExecuteReader返回ILIST<>
单值查询ExecuteScalar
删改增等操作OracleHelper.ExecuteNonQuery
不定条件的动态查询查询:关键在于OracleParameter数组的构造,和oraclecommand的匹配由OracleHelper来做。
分页查询:不知道别人怎么做的,我们是修改了一下OracleHelper,增加了按照页号和总页数查询的动态sql,这样返回的数据集可以控制,对海量数据查询有性能优势。
2.企业库的解决之道
构造database:DatabaseFactory.CreateDatabase();之后构造DbCommand和DbCommand的参数
最后database类的ExecuteNonQuery或ExecuteReader完成增删改查
查询也可以用ExecuteDataSet或者LoadDataSet返回dataset,不过我觉得返回Ilist<>更方便以后使用
LoadDataSet:加载已经存在的DataSet,ExecuteDataSet:创建新DataSet
例如:
// DataSet that will hold the returned results
DataSet productsDataSet = null;
productsDataSet = db.ExecuteDataSet(dbCommand);
使用DataSet批量更新
db.UpdateDataSet();
要注意的是,企业库对ExecuteDataSet自动执行连接和释放,ExecuteReader应该using一下,即早释放
三、事务控制
基础话题:ADO.NET提供的事务控制
1.ado.net1.1的事务控制
声明OracleConnection和OracleTransaction对象
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
这种方式存在的问题是:
1.对于多层开发框架,增删改查在oracleDAL中封装,只能在oracleDAL中调用
2.分布式事务不容易实现.
带事务调用OracleHelper的ExecuteNonQuery
2:ADO.NET2.0的事务控制
2.1用TransactionScope实现事务控制
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
特点:
1.很方便的实现分布式调用
2.支持嵌套事务
2.同上:如果增删改查在oracleDAL中封装,就只能在oracleDAL中调用,如果是用存储过程,这里处理会灵活些。
3.由于调用MSDTC,不太清楚是否会有性能问题
引申话题
在实际应用中,多层开发结构不会直接使用ADO.NET,可能象Petshop那样,会使用一个OracleHelper来封装对数据库的基础操作,也可能使用企业库来实现数据操作;这里讨论使用OracleHelper的情况,企业库第三章在详细讨论。
1.OracleHelper的情况
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
疑惑:觉得这种调用方式还是象ado.net1.1的那种,不知道分布式事务是否是否支持,不过我们的项目中没有用到分布式事务,也没有深入考虑。
在以前见到使用System.EnterpriseServices实现的一个例子,不过从没有用过,觉得意义不大。
2.2在页面级实现事务
使用了System.EnterpriseServices,利用ContextUtil类
添加引用System.EnterpriseServices.dll
using System.EnterpriseServices;
随便建立一个按钮,在按钮中进行如下操作:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
修改前台页面在<%Page后面添加 Transaction="Required" 即可
3.使用企业库实现事务控制
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
使用企业库控制事务的问题:
1.不知道是否支持分布式事务,谁知道指点一下。
2.如果不涉及事务,连接是自动管理的。但是使用事务控制要using connection,所有如果增删改查在oracleDAL中封装,就只能在oracleDAL中调用。
参考资源:
http://idior.cnblogs.com/archive/2005/08/15/214300.html
http://blog.joycode.com/kaneboy/archive/2005/02/15/44356.aspx
http://www.cnblogs.com/ltp/archive/2006/02/20/334371.html