欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

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

程序员文章站 2022-05-11 14:35:09
...

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

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

下面来看一下具体代码:

首先是IDataReaderToEntityStrategy接口

对数据访问层第一种实现(Acc+SQL)的重构IDataReaderToEntityStrategy
1对数据访问层第一种实现(Acc+SQL)的重构using System;
2对数据访问层第一种实现(Acc+SQL)的重构using System.Collections.Generic;
3对数据访问层第一种实现(Acc+SQL)的重构using System.Text;
4对数据访问层第一种实现(Acc+SQL)的重构using System.Data;
5对数据访问层第一种实现(Acc+SQL)的重构using System.Data.OleDb;
6对数据访问层第一种实现(Acc+SQL)的重构
7对数据访问层第一种实现(Acc+SQL)的重构namespace NGuestBook.AccessDAL
8对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
9对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
10对数据访问层第一种实现(Acc+SQL)的重构/// 由DataReader转换成实体类的策略接口
11对数据访问层第一种实现(Acc+SQL)的重构///

12对数据访问层第一种实现(Acc+SQL)的重构 public interface IDataReaderToEntityStrategyT>
13对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
14对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
15对数据访问层第一种实现(Acc+SQL)的重构/// 将DataReader转换为实体类,采用泛型
16对数据访问层第一种实现(Acc+SQL)的重构///
17对数据访问层第一种实现(Acc+SQL)的重构/// 包含数据的DataReader对象
18对数据访问层第一种实现(Acc+SQL)的重构/// 实体类

19对数据访问层第一种实现(Acc+SQL)的重构 T DataReaderToEntity(OleDbDataReader dataReader);
20对数据访问层第一种实现(Acc+SQL)的重构 }

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

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

1对数据访问层第一种实现(Acc+SQL)的重构using System;
2对数据访问层第一种实现(Acc+SQL)的重构using System.Collections.Generic;
3对数据访问层第一种实现(Acc+SQL)的重构using System.Web;
4对数据访问层第一种实现(Acc+SQL)的重构using System.Web.Caching;
5对数据访问层第一种实现(Acc+SQL)的重构using System.Configuration;
6对数据访问层第一种实现(Acc+SQL)的重构using System.Data;
7对数据访问层第一种实现(Acc+SQL)的重构using System.Data.OleDb;
8对数据访问层第一种实现(Acc+SQL)的重构using NGuestBook.Utility;
9对数据访问层第一种实现(Acc+SQL)的重构
10对数据访问层第一种实现(Acc+SQL)的重构namespace NGuestBook.AccessDAL
11对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
12对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
13对数据访问层第一种实现(Acc+SQL)的重构/// Access数据库操作助手
14对数据访问层第一种实现(Acc+SQL)的重构///

15对数据访问层第一种实现(Acc+SQL)的重构 public sealed class AccessDALHelper
16对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
17对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
18对数据访问层第一种实现(Acc+SQL)的重构/// 读取Access数据库的连接字符串
19对数据访问层第一种实现(Acc+SQL)的重构/// 首先从缓存里读取,如果不存在则到配置文件中读取,并放入缓存
20对数据访问层第一种实现(Acc+SQL)的重构///
21对数据访问层第一种实现(Acc+SQL)的重构/// Access数据库的连接字符串

22对数据访问层第一种实现(Acc+SQL)的重构 private static string GetConnectionString()
23对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
24对数据访问层第一种实现(Acc+SQL)的重构if (CacheAccess.GetFromCache("AccessConnectionString") != null)
25对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
26对数据访问层第一种实现(Acc+SQL)的重构return CacheAccess.GetFromCache("AccessConnectionString").ToString();
27对数据访问层第一种实现(Acc+SQL)的重构 }

28对数据访问层第一种实现(Acc+SQL)的重构else
29对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
30对数据访问层第一种实现(Acc+SQL)的重构string dbPath = ConfigurationManager.AppSettings["AccessPath"];
31对数据访问层第一种实现(Acc+SQL)的重构string dbAbsolutePath = HttpContext.Current.Server.MapPath(dbPath);
32对数据访问层第一种实现(Acc+SQL)的重构string connectionString = ConfigurationManager.AppSettings["AccessConnectionString"];
33对数据访问层第一种实现(Acc+SQL)的重构
34对数据访问层第一种实现(Acc+SQL)的重构 CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
35对数据访问层第一种实现(Acc+SQL)的重构 CacheAccess.SaveToCache("AccessConnectionString", connectionString.Replace("{DBPath}", dbAbsolutePath), fileDependency);
36对数据访问层第一种实现(Acc+SQL)的重构
37对数据访问层第一种实现(Acc+SQL)的重构return connectionString.Replace("{DBPath}", dbAbsolutePath);
38对数据访问层第一种实现(Acc+SQL)的重构 }

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

40对数据访问层第一种实现(Acc+SQL)的重构
41对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
42对数据访问层第一种实现(Acc+SQL)的重构/// 执行SQL语句并且不返回任何值
43对数据访问层第一种实现(Acc+SQL)的重构///
44对数据访问层第一种实现(Acc+SQL)的重构/// 所执行的SQL命令
45对数据访问层第一种实现(Acc+SQL)的重构/// 参数集合

46对数据访问层第一种实现(Acc+SQL)的重构 public static void ExecuteSQLNonQuery(string SQLCommand, OleDbParameter[] parameters)
47对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
48对数据访问层第一种实现(Acc+SQL)的重构 OleDbConnection connection = new OleDbConnection(GetConnectionString());
49对数据访问层第一种实现(Acc+SQL)的重构 OleDbCommand command = new OleDbCommand(SQLCommand, connection);
50对数据访问层第一种实现(Acc+SQL)的重构
51对数据访问层第一种实现(Acc+SQL)的重构for (int i = 0; i parameters.Length; i++)
52对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
53对数据访问层第一种实现(Acc+SQL)的重构 command.Parameters.Add(parameters[i]);
54对数据访问层第一种实现(Acc+SQL)的重构 }

55对数据访问层第一种实现(Acc+SQL)的重构
56对数据访问层第一种实现(Acc+SQL)的重构 connection.Open();
57对数据访问层第一种实现(Acc+SQL)的重构 command.ExecuteNonQuery();
58对数据访问层第一种实现(Acc+SQL)的重构 connection.Close();
59对数据访问层第一种实现(Acc+SQL)的重构 }

60对数据访问层第一种实现(Acc+SQL)的重构
61对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
62对数据访问层第一种实现(Acc+SQL)的重构/// 执行SQL语句并返回包含查询结果的DataReader
63对数据访问层第一种实现(Acc+SQL)的重构///
64对数据访问层第一种实现(Acc+SQL)的重构/// 所执行的SQL命令
65对数据访问层第一种实现(Acc+SQL)的重构/// 参数集合
66对数据访问层第一种实现(Acc+SQL)的重构///

67对数据访问层第一种实现(Acc+SQL)的重构 public static OleDbDataReader ExecuteSQLDataReader(string SQLCommand, OleDbParameter[] parameters)
68对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
69对数据访问层第一种实现(Acc+SQL)的重构 OleDbConnection connection = new OleDbConnection(GetConnectionString());
70对数据访问层第一种实现(Acc+SQL)的重构 OleDbCommand command = new OleDbCommand(SQLCommand, connection);
71对数据访问层第一种实现(Acc+SQL)的重构
72对数据访问层第一种实现(Acc+SQL)的重构for (int i = 0; i parameters.Length; i++)
73对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
74对数据访问层第一种实现(Acc+SQL)的重构 command.Parameters.Add(parameters[i]);
75对数据访问层第一种实现(Acc+SQL)的重构 }

76对数据访问层第一种实现(Acc+SQL)的重构
77对数据访问层第一种实现(Acc+SQL)的重构 connection.Open();
78对数据访问层第一种实现(Acc+SQL)的重构 OleDbDataReader dataReader = command.ExecuteReader();
79对数据访问层第一种实现(Acc+SQL)的重构//connection.Close();
80对数据访问层第一种实现(Acc+SQL)的重构
81对数据访问层第一种实现(Acc+SQL)的重构return dataReader;
82对数据访问层第一种实现(Acc+SQL)的重构 }

83对数据访问层第一种实现(Acc+SQL)的重构
84对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
85对数据访问层第一种实现(Acc+SQL)的重构/// 执行不需要返回数据的操作
86对数据访问层第一种实现(Acc+SQL)的重构///
87对数据访问层第一种实现(Acc+SQL)的重构/// SQL命令
88对数据访问层第一种实现(Acc+SQL)的重构/// 参数
89对数据访问层第一种实现(Acc+SQL)的重构/// 是否成功

90对数据访问层第一种实现(Acc+SQL)的重构 public static bool OperateNonData(string SQLCommand, OleDbParameter[] parameters)
91对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
92对数据访问层第一种实现(Acc+SQL)的重构try
93对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
94对数据访问层第一种实现(Acc+SQL)的重构 ExecuteSQLNonQuery(SQLCommand, parameters);
95对数据访问层第一种实现(Acc+SQL)的重构return true;
96对数据访问层第一种实现(Acc+SQL)的重构 }

97对数据访问层第一种实现(Acc+SQL)的重构catch
98对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
99对数据访问层第一种实现(Acc+SQL)的重构return false;
100对数据访问层第一种实现(Acc+SQL)的重构 }

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

102对数据访问层第一种实现(Acc+SQL)的重构
103对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
104对数据访问层第一种实现(Acc+SQL)的重构/// 执行返回单个实体类的操作
105对数据访问层第一种实现(Acc+SQL)的重构///
106对数据访问层第一种实现(Acc+SQL)的重构/// 实体类类型
107对数据访问层第一种实现(Acc+SQL)的重构/// SQL命令
108对数据访问层第一种实现(Acc+SQL)的重构/// 参数
109对数据访问层第一种实现(Acc+SQL)的重构/// DataReader到实体类的转换策略
110对数据访问层第一种实现(Acc+SQL)的重构/// 实体类

111对数据访问层第一种实现(Acc+SQL)的重构 public static T OperateEntityT>(string SQLCommand, OleDbParameter[] parameters, IDataReaderToEntityStrategyT> strategy)
112对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
113对数据访问层第一种实现(Acc+SQL)的重构 OleDbDataReader dataReader = ExecuteSQLDataReader(SQLCommand, parameters);
114对数据访问层第一种实现(Acc+SQL)的重构try
115对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
116对数据访问层第一种实现(Acc+SQL)的重构if (!dataReader.HasRows)
117对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
118对数据访问层第一种实现(Acc+SQL)的重构throw new Exception();
119对数据访问层第一种实现(Acc+SQL)的重构 }

120对数据访问层第一种实现(Acc+SQL)的重构
121对数据访问层第一种实现(Acc+SQL)的重构 dataReader.Read();
122对数据访问层第一种实现(Acc+SQL)的重构return strategy.DataReaderToEntity(dataReader);
123对数据访问层第一种实现(Acc+SQL)的重构 }

124对数据访问层第一种实现(Acc+SQL)的重构catch
125对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
126对数据访问层第一种实现(Acc+SQL)的重构return default(T);
127对数据访问层第一种实现(Acc+SQL)的重构 }

128对数据访问层第一种实现(Acc+SQL)的重构finally
129对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
130对数据访问层第一种实现(Acc+SQL)的重构 dataReader.Close();
131对数据访问层第一种实现(Acc+SQL)的重构 }

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

133对数据访问层第一种实现(Acc+SQL)的重构
134对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构/**////
135对数据访问层第一种实现(Acc+SQL)的重构/// 执行返回实体类集合的操作
136对数据访问层第一种实现(Acc+SQL)的重构///
137对数据访问层第一种实现(Acc+SQL)的重构/// 实体类类型
138对数据访问层第一种实现(Acc+SQL)的重构/// SQL命令
139对数据访问层第一种实现(Acc+SQL)的重构/// 参数
140对数据访问层第一种实现(Acc+SQL)的重构/// DataReader到实体类的转换策略
141对数据访问层第一种实现(Acc+SQL)的重构/// 实体类

142对数据访问层第一种实现(Acc+SQL)的重构 public static IListT> OperateEntityCollectionT>(string SQLCommand, OleDbParameter[] parameters, IDataReaderToEntityStrategyT> strategy)
143对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
144对数据访问层第一种实现(Acc+SQL)的重构 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, null);
145对数据访问层第一种实现(Acc+SQL)的重构try
146对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
147对数据访问层第一种实现(Acc+SQL)的重构if (!dataReader.HasRows)
148对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构对数据访问层第一种实现(Acc+SQL)的重构{
149对数据访问层第一种实现(Acc+SQL)的重构 &对数据访问层第一种实现(Acc+SQL)的重构

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • 对数据访问层第一种实现(Acc+SQL)的重构
  • 专题推荐

    作者信息
    对数据访问层第一种实现(Acc+SQL)的重构

    认证0级讲师

    推荐视频教程
  • 对数据访问层第一种实现(Acc+SQL)的重构javascript初级视频教程
  • 对数据访问层第一种实现(Acc+SQL)的重构jquery 基础视频教程
  • 视频教程分类
    ");}}}}topobj_second.html(topsecond);topobj_minutes.html(topminutes);topobj_hours.html(tophours);topobj_day.html(topday);},1000);}$('.topimages .layui-icon-close').click(function(){$.cookie('phpcndatatopadshows',1,{expires:7});$('.topimages').hide();});