昨天的文章基于.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与具体策略无关,仅与接口耦合。

下面来看一下具体代码:

首先是IDataReaderToEntityStrategy接口IDataReaderToEntityStrategy1

usingSystem;2usingSystem.Collections.Generic;3usingSystem.Text;4usingSystem.Data;5usingSystem.Data.OleDb;67namespaceNGuestBook.AccessDAL8

{9

/**10///由DataReader转换成实体类的策略接口11///

12

publicinterfaceIDataReaderToEntityStrategy13

{14

/**15///将DataReader转换为实体类,采用泛型16///17///包含数据的DataReader对象18///实体类

19

T DataReaderToEntity(OleDbDataReader dataReader);20 }21}

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

1

usingSystem;2usingSystem.Collections.Generic;3usingSystem.Web;4usingSystem.Web.Caching;5usingSystem.Configuration;6usingSystem.Data;7usingSystem.Data.OleDb;8usingNGuestBook.Utility;910namespaceNGuestBook.AccessDAL11

{12

/**13///Access数据库操作助手14///

15

publicsealedclassAccessDALHelper16

{17

/**18///读取Access数据库的连接字符串19///首先从缓存里读取,如果不存在则到配置文件中读取,并放入缓存20///21///Access数据库的连接字符串

22

privatestaticstringGetConnectionString()23

{24if(CacheAccess.GetFromCache("AccessConnectionString")!=null)25

{26returnCacheAccess.GetFromCache("AccessConnectionString").ToString();27 }28else29

{30stringdbPath=ConfigurationManager.AppSettings["AccessPath"];31stringdbAbsolutePath=HttpContext.Current.Server.MapPath(dbPath);32stringconnectionString=ConfigurationManager.AppSettings["AccessConnectionString"];3334 CacheDependency fileDependency=newCacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));35 CacheAccess.SaveToCache("AccessConnectionString", connectionString.Replace("{DBPath}", dbAbsolutePath), fileDependency);3637returnconnectionString.Replace("{DBPath}", dbAbsolutePath);38 }39 }4041

/**42///执行SQL语句并且不返回任何值43///44///所执行的SQL命令45///参数集合

46

publicstaticvoidExecuteSQLNonQuery(stringSQLCommand, OleDbParameter[] parameters)47

{48 OleDbConnection connection=newOleDbConnection(GetConnectionString());49 OleDbCommand command=newOleDbCommand(SQLCommand, connection);5051for(inti=0; i

{53 command.Parameters.Add(parameters[i]);54 }5556 connection.Open();57 command.ExecuteNonQuery();58 connection.Close();59 }6061

/**62///执行SQL语句并返回包含查询结果的DataReader63///64///所执行的SQL命令65///参数集合66///

67

publicstaticOleDbDataReader ExecuteSQLDataReader(stringSQLCommand, OleDbParameter[] parameters)68

{69 OleDbConnection connection=newOleDbConnection(GetConnectionString());70 OleDbCommand command=newOleDbCommand(SQLCommand, connection);7172for(inti=0; i

{74 command.Parameters.Add(parameters[i]);75 }7677 connection.Open();78 OleDbDataReader dataReader=command.ExecuteReader();79//connection.Close();8081returndataReader;82 }8384

/**85///执行不需要返回数据的操作86///87///SQL命令88///参数89///是否成功

90

publicstaticboolOperateNonData(stringSQLCommand, OleDbParameter[] parameters)91

{92try93

{94 ExecuteSQLNonQuery(SQLCommand, parameters);95returntrue;96 }97catch98

{99returnfalse;100 }101 }102103

/**104///执行返回单个实体类的操作105///106///实体类类型107///SQL命令108///参数109///DataReader到实体类的转换策略110///实体类

111

publicstaticT OperateEntity(stringSQLCommand, OleDbParameter[] parameters, IDataReaderToEntityStrategystrategy)112

{113 OleDbDataReader dataReader=ExecuteSQLDataReader(SQLCommand, parameters);114try115

{116if(!dataReader.HasRows)117

{118thrownewException();119 }120121 dataReader.Read();122returnstrategy.DataReaderToEntity(dataReader);123 }124catch125

{126returndefault(T);127 }128finally129

{130 dataReader.Close();131 }132 }133134

/**135///执行返回实体类集合的操作136///137///实体类类型138///SQL命令139///参数140///DataReader到实体类的转换策略141///实体类

142

publicstaticIListOperateEntityCollection(stringSQLCommand, OleDbParameter[] parameters, IDataReaderToEntityStrategystrategy)143

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

  1. 抽象工厂+反射+依赖注入 实现对数据访问层和业务逻辑层的优化

    分层思想的一个核心就是部件化,各个层之间是相互独立的,每一层可以随便抽取换成一个其他语言的版本,但只要与相应的接口吻合就行. 我用的三层架构大致是这样的,基本的三层就不说了,然后分别为业务逻辑层和数据 ...

  2. 持久层和数据访问层_什么是持久层? JDBC 演变的 Mybatis 架构分析

    前言 ORM 持久层指的是:将业务数据存储到磁盘,也具备长期存储能力,只要磁盘不损坏,如果在断电情况下,重启系统仍然可以读取数据 01.JDBC 1.1 什么是 jdbc JDBC(JavaDataB ...

  3. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  4. Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层

    原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研 ...

  5. PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层

    第十四章 数据访问层指导 概览 这一章主要描述设计数据访问层时要注意的主要原则.它们覆盖了设计数据访问层遇到的通常问题及错误.下面的图表展示了数据层怎样嵌入一个通用的应用架构. (cnblog我的图片 ...

  6. 控制层远程调用业务层_如何应用数据访问服务层分离系统中的业务层和持久层之间耦合关系...

    软件项目实训及课程设计指导--如何应用数据访问服务层分离业务层和持久层之间耦合关系 作者已经在本系列文章<软件项目实训及课程设计指导--如何正确地设计J2EE应用系统持久层中的各个组件结构及关系 ...

  7. 表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)

    三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...

  8. android ui层 交互层 业务逻辑层 服务层,表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)...

    三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了"高内聚,低耦 ...

  9. 三层架构:表示层-业务逻辑层-数据访问层

    三层架构和MVC是两个东西. 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页 ...

最新文章

  1. c++ to_string用法
  2. 最强 Java Redis 客户端
  3. 用WDM开发USB驱动程序
  4. 【BZOJ3527】【ZJOI2014】力
  5. 第六章 Windows应用程序对键盘与鼠标的响应
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]49.描述在IPsec和TLS后的基本想法
  7. python私人定制_手把手教你学python第十五讲(魔法方法续私人“定制”)
  8. fatal error LNK1120: 11 unresolved externals
  9. httpRuntime一使用
  10. 不用u盘安装linux真机,无需u盘和光盘安装linux
  11. switch常用的交换机配置命令
  12. 以太网帧机构 ,mtu ,分包原理 tcp的三次握手,四次挥手
  13. [Java]-单例模式与volatile简介
  14. 虚幻4渲染编程(材质编辑器篇)【第五卷:布料,丝绸纱皮革棉】
  15. 升级sp3后出现:一个问题阻止windows正确检测此机器许可证--解决方案
  16. 直接购买同城跑腿系统源码,有什么好处呢?
  17. C++ 第八节数据结构 第七节 ——二叉搜索树 AVL树 红黑树(底层原理图+模拟实现)
  18. Soild性能居然这么厉害,Vue、React和Angular竟纷纷跌出前十
  19. 点击button按钮实现全选_全选按钮的实现及事件的处理
  20. 添加okhttp+android+studio,OKHTTP3 简单使用(一) 介绍及Android Studio集成

热门文章

  1. mysql5.7导出数据_mysql5.7导出数据时出现--secure-file-priv选项应对方法
  2. oracle查询表字段横向排序,sql 查询 - 横着走的螃蟹 - OSCHINA - 中文开源技术交流社区...
  3. C语言--第2次作业
  4. git、github的基本使用
  5. VS2015 新Web项目(C#6)出现CS1617错误的解决
  6. TStringList 的Sorted属性
  7. android AVD详解
  8. DevExrepss的Grid属性设置及常用方法总结
  9. 1001. A+B Format
  10. Linux系统的各种安装方法与修复技巧