php数据访问层,对数据访问层第一种实现(Acc+SQL)的重构

本文作者针对.NET平台的分层架构实践进行了优化,解决了Connection和DataReader资源管理问题,引入泛型和Strategy模式减少代码冗余。主要关注返回单个实体和集合的通用操作,展示了如何利用策略模式处理不同实体类的转换。
摘要由CSDN通过智能技术生成

昨天的文章基于.NET平台的分层架构实战(七) 数据 访问 层的 第一 种 实现 :Access+SQL发布后,很多朋友对我的程序提出了意见和建议,在这里先谢谢你们!!!尤其是金色海洋(jyk),对我的程序提出了很多建设性的意见。 我大体总结了一下,昨天程序的主要

昨天的文章基于.NET平台的分层架构实战(七)——数据访问层的第一种实现:Access+SQL发布后,很多朋友对我的程序提出了意见和建议,在这里先谢谢你们!!!尤其是 金色海洋(jyk),对我的程序提出了很多建设性的意见。

我大体总结了一下,昨天程序的主要缺点有:

1.Connection对象没有关闭

2.DataReader对象没有关闭

3.相似代码太多,造成代码冗余。

其中第一点问题,目前还没有太好的解决方案,主要是因为Connection一旦关闭,DataReader就无法读取了。而且,Connection对象应该会自动在适当的时候关闭(通过观察临时文件得出),并且在实际运行时并无影响(在功能上),所以这里没有专门解决。而针对后面两个问题,我使用了如下解决方案。

对于关闭DataReader的方法,实现起来很简单,在finally里将他关闭就行了。关键是如何去处冗余代码。

经过我的分析,数据访问层的操作可以分为三类:不返回数据,返回单个实体类,返回实体类集合。我将这三种操作的公共部分抽出,写成三个方法放在AccessDALHelper里,类型不同的问题使用泛型解决。

这样做有一个难题,就是不同实体在由DataReader转化为实体类时的代码很不一样,无法抽出。这里,我使用了Strategy模式解决。具体做法是:首先定义一个由DataReader转换为实体类的策略接口,然后为不同的实体编写不同的转换策略,示意图如下:可以看出,所有转换策略都要实现IDataReaderToEntityStrategy接口,并且每个策略都有一个自组合,这是以为他们都要实现Singleton模式。而AccessDALHelper与具体策略无关,仅与接口耦合。

13702980612020.jpg

下面来看一下具体代码:

首先是IDataReaderToEntityStrategy接口mysql-tutorials-118849.htmlIDataReaderToEntityStrategy1

13702980612802.gifusingSystem;213702980613243.gifusingSystem.Collections.Generic;313702980612802.gifusingSystem.Text;413702980613925.gifusingSystem.Data;513702980613925.gifusingSystem.Data.OleDb;613702980613925.gif713702980613243.gifnamespaceNGuestBook.AccessDAL813702980612461.gif

mysql-tutorials-118849.html137029806159511.gif{9137029806162912.gif

mysql-tutorials-118849.html/**10137029806170314.gif///由DataReader转换成实体类的策略接口11137029806173715.gif///

12

137029806177116.gifpublicinterfaceIDataReaderToEntityStrategy13137029806162912.gif

mysql-tutorials-118849.html137029806187419.gif{14137029806190920.gif

mysql-tutorials-118849.html/**15137029806170314.gif///将DataReader转换为实体类,采用泛型16137029806170314.gif///17137029806204624.gif///包含数据的DataReader对象18137029806208025.gif///实体类

19

137029806177116.gifT DataReaderToEntity(OleDbDataReader dataReader);20137029806214827.gif }21137029806218228.gif}

然后以Admin为例,看一下策略的具体实现:

1

13702980613243.gifusingSystem;2137029806225030.gifusingSystem.Collections.Generic;313702980613243.gifusingSystem.Web;413702980613925.gifusingSystem.Web.Caching;5137029806225030.gifusingSystem.Configuration;613702980612802.gifusingSystem.Data;7137029806225030.gifusingSystem.Data.OleDb;8137029806225030.gifusingNGuestBook.Utility;913702980613243.gif10137029806225030.gifnamespaceNGuestBook.AccessDAL11137029806255239.gif

mysql-tutorials-118849.html137029806187419.gif{12137029806162912.gif

mysql-tutorials-118849.html/**13137029806272044.gif///Access数据库操作助手14137029806275545.gif///

15

137029806272044.gifpublicsealedclassAccessDALHelper16137029806190920.gif

mysql-tutorials-118849.html137029806159511.gif{17137029806292450.gif

mysql-tutorials-118849.html/**18137029806170314.gif///读取Access数据库的连接字符串19137029806204624.gif///首先从缓存里读取,如果不存在则到配置文件中读取,并放入缓存20137029806272044.gif///21137029806208025.gif///Access数据库的连接字符串

22

137029806272044.gifprivatestaticstringGetConnectionString()23137029806292450.gif

mysql-tutorials-118849.html137029806322659.gif{24137029806204624.gifif(CacheAccess.GetFromCache("AccessConnectionString")!=null)25137029806329561.gif

mysql-tutorials-118849.html137029806187419.gif{26137029806272044.gifreturnCacheAccess.GetFromCache("AccessConnectionString").ToString();27137029806214827.gif }28137029806272044.gifelse29137029806329561.gif

mysql-tutorials-118849.html137029806159511.gif{30137029806204624.gifstringdbPath=ConfigurationManager.AppSettings["AccessPath"];31137029806177116.gifstringdbAbsolutePath=HttpContext.Current.Server.MapPath(dbPath);32137029806177116.gifstringconnectionString=ConfigurationManager.AppSettings["AccessConnectionString"];33137029806272044.gif34137029806177116.gif CacheDependency fileDependency=newCacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));35137029806272044.gif CacheAccess.SaveToCache("AccessConnectionString", connectionString.Replace("{DBPath}", dbAbsolutePath), fileDependency);36137029806272044.gif37137029806177116.gifreturnconnectionString.Replace("{DBPath}", dbAbsolutePath);38137029806208025.gif }39137029806275545.gif }40137029806204624.gif41137029806162912.gif

mysql-tutorials-118849.html/**42137029806170314.gif///执行SQL语句并且不返回任何值43137029806204624.gif///44137029806204624.gif///所执行的SQL命令45137029806214827.gif///参数集合

46

137029806170314.gifpublicstaticvoidExecuteSQLNonQuery(stringSQLCommand, OleDbParameter[] parameters)47137029806190920.gif

mysql-tutorials-118849.html137029806427290.gif{48137029806272044.gif OleDbConnection connection=newOleDbConnection(GetConnectionString());49137029806170314.gif OleDbCommand command=newOleDbCommand(SQLCommand, connection);50137029806272044.gif51137029806204624.giffor(inti=0; i

mysql-tutorials-118849.html137029806322659.gif{53137029806177116.gif command.Parameters.Add(parameters[i]);54137029806275545.gif }55137029806272044.gif56137029806272044.gif connection.Open();57137029806272044.gif command.ExecuteNonQuery();58137029806177116.gif connection.Close();59137029806173715.gif }60137029806204624.gif61137029806329561.gif

mysql-tutorials-118849.html/**62137029806272044.gif///执行SQL语句并返回包含查询结果的DataReader63137029806204624.gif///64137029806177116.gif///所执行的SQL命令65137029806177116.gif///参数集合66137029806208025.gif///

67

137029806177116.gifpublicstaticOleDbDataReader ExecuteSQLDataReader(stringSQLCommand, OleDbParameter[] parameters)68137029806292450.gif

mysql-tutorials-118849.html137029806187419.gif{69137029806204624.gif OleDbConnection connection=newOleDbConnection(GetConnectionString());70137029806170314.gif OleDbCommand command=newOleDbCommand(SQLCommand, connection);71137029806272044.gif72137029806170314.giffor(inti=0; i

mysql-tutorials-118849.html137029806187419.gif{74137029806177116.gif command.Parameters.Add(parameters[i]);75137029806173715.gif }76137029806177116.gif77137029806272044.gif connection.Open();78137029806272044.gif OleDbDataReader dataReader=command.ExecuteReader();79137029806177116.gif//connection.Close();80137029806170314.gif81137029806272044.gifreturndataReader;82137029806173715.gif }83137029806177116.gif84137029806329561.gif

mysql-tutorials-118849.html/**85137029806204624.gif///执行不需要返回数据的操作86137029806204624.gif///87137029806177116.gif///SQL命令88137029806177116.gif///参数89137029806214827.gif///是否成功

90

137029806177116.gifpublicstaticboolOperateNonData(stringSQLCommand, OleDbParameter[] parameters)91137029806292450.gif

mysql-tutorials-118849.html137029806427290.gif{92137029806272044.giftry93137029806190920.gif

mysql-tutorials-118849.html137029806427290.gif{94137029806204624.gif ExecuteSQLNonQuery(SQLCommand, parameters);95137029806204624.gifreturntrue;96137029806173715.gif }97137029806177116.gifcatch98137029806292450.gif

mysql-tutorials-118849.html137029806322659.gif{99137029806177116.gifreturnfalse;100137029806173715.gif }101137029806214827.gif }102137029806272044.gif103137029806190920.gif

mysql-tutorials-118849.html/**104137029806272044.gif///执行返回单个实体类的操作105137029806204624.gif///106137029806204624.gif///实体类类型107137029806177116.gif///SQL命令108137029806177116.gif///参数109137029806272044.gif///DataReader到实体类的转换策略110137029806208025.gif///实体类

111

137029806177116.gifpublicstaticT OperateEntity(stringSQLCommand, OleDbParameter[] parameters, IDataReaderToEntityStrategystrategy)112137029806190920.gif

mysql-tutorials-118849.html137029806427290.gif{113137029806170314.gif OleDbDataReader dataReader=ExecuteSQLDataReader(SQLCommand, parameters);114137029806272044.giftry115137029806162912.gif

mysql-tutorials-118849.html137029806322659.gif{116137029806170314.gifif(!dataReader.HasRows)117137029806329561.gif

mysql-tutorials-118849.html137029806427290.gif{118137029806177116.gifthrownewException();119137029806214827.gif }120137029806170314.gif121137029806204624.gif dataReader.Read();122137029806170314.gifreturnstrategy.DataReaderToEntity(dataReader);123137029806214827.gif }124137029806170314.gifcatch125137029806329561.gif

mysql-tutorials-118849.html137029806159511.gif{126137029806272044.gifreturndefault(T);127137029806173715.gif }128137029806177116.giffinally129137029806162912.gif

mysql-tutorials-118849.html137029806427290.gif{130137029806204624.gif dataReader.Close();131137029806173715.gif }132137029806208025.gif }133137029806170314.gif134137029806190920.gif

mysql-tutorials-118849.html/**135137029806272044.gif///执行返回实体类集合的操作136137029806170314.gif///137137029806170314.gif///实体类类型138137029806170314.gif///SQL命令139137029806177116.gif///参数140137029806204624.gif///DataReader到实体类的转换策略141137029806275545.gif///实体类

142

137029806170314.gifpublicstaticIListOperateEntityCollection(stringSQLCommand, OleDbParameter[] parameters, IDataReaderToEntityStrategystrategy)143137029806292450.gif

mysql-tutorials-118849.html137029806427290.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值