上一篇打造自己的数据访问层(二)中,我们已具体实现了数据访问层对应的功能,该进行收尾工作了,先来看段代码,试试上一篇实现的功能:

View Code

string sqlText = "SELECT ID, NAME, VAL FROM TEST";
string columns = "ID, NAME, VAL";
DataSet ds = new DataSet();
DataExecutor execObj = new MSSqlExecutor();
DataMapping map = new DataMapping();
map.ExecuteObject = execObj;
map.TableName = "TEST";
map.KeyColumns = "ID";
map.Columns = "ID, NAME, VAL";
DataMapping map = new DataMapping(execObj.GetInstant(), "TEST", "ID", columns);
map.Fill(sqlText, "TEST");
map.SetCommands(DataCommandType.Insert | DataCommandType.Update | DataCommandType.Delete, ds);
//DataTable方式进行增、删、改
bool isSuccess = execObj.Update();

果然已经完成了对数据库的读写操作了,至少不用再写大段的参数传递代码,功能都已经实现了,是不是就完成了?
仔细看看上面的代码,实际上还有问题尚未解决,看看这句:

DataExecutor execObj = new MSSqlExecutor();

竟然在代码里直接实例化一个MSSql的执行对象,这样一开始提出的数据库之间的切换问题根本就没有从本质上解决。
再回过头来看上一篇,有一个方法public IDbConnection GetConn(),用来获取数据连接对像,之前并没有说明其如何实现。
我们知道DBConnection有两个关键信息:
1、与哪种类型的数据库产生连接,这个前面已经解决了。
2、传递与数据库连接的帐号信息、访问库信息的ConnectionString,这个并没有提及。
看看第二点以前是怎么做的:

View Code

public IDbConnection GetConn()
{
if (conn != null)
{
return conn;
}

conn = new SqlConnection();
conn.ConnectionString = 连接字串;
return conn;
}

上面出现了连接字串,这个字串从哪来?

总结下,要完成最终的数据访问输出,还需要解决两个问题:
1、动态进行不同数据库之间的切换。
2、解决数据连接字串的来源问题。

接着就来解决这两问题,先解决第二个问题,有个比较简单的方法,将连接字串写入配置文件中去,数据访问层只需知道它传递过来KEY值:

<appSettings>
<add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>
</appSettings>

第一个问题解决了,只剩下最后一个问题了,如何动态切换不同的数据库,也就是说,在使用的时候不需要自己NEW一个对象,而是通过第三方来创建一个对象,实际上,设计模式里已提出了方案,创建型模式,有兴趣的朋友可以自行研究,我们这里只需要用到简单工厂模式:

View Code

public sealed class ExecutorFactory
{
public static DataExecutor Create()
{
return Create(DatabaseType.MSSql);
}

public static DataExecutor Create(DatabaseType dbType)
{
AbstractDataBase dataBase = null;
Switch(dbType)
{
case DatabaseType.MSSql:
dataBase = new MSSqlDataBase();
break;
case DatabaseType.Oracle:
dataBase = new OracleDataBase();
break;
}

return dataBase.Create();
}
}

现在可对这句代码进行替换了:DataExecutor execObj = new MSSqlExecutor();
替换为:DataExecutor execObj = ExecutorFactory.Create();
至此,问题都解决了,切换数据库是只需更改DatabaseType为相应的数库类型。 
接下来再考虑下,如果改变数据库类型也不需要变动程序,能不能实现?
还是利用配置文件,只是此时提供的不是类型字串,而是实际的数据执行者程序集信息,再利用.NET的天然优势反射可以实现了。
最终配置文件为:

<appSettings>
<add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>
<add key="DBExecutor" value="FM.DataAccess, FM.DataAccess.MappingExcuter.MSSqlExecutor"></add>
</appSettings>

改造后的工厂:

View Code

public sealed class ExecutorFactory
{
public static DataExecutor Create()
{
return Create(null);
}

public static DataExecutor Create(string dataBaseTypeKey)
{
return Create(dataBaseTypeKey, null);
}

public static DataExecutor Create(string dataBaseTypeKey, string connStrKey)
{
if (string.IsNullOrEmpty(dataBaseTypeKey))
{
dataBaseTypeKey = "DBExecutor";
}

string[] sltDataBaseType = ConfigReader.Read(dataBaseTypeKey).Split(',');
string asselblyName = sltDataBaseType[0];
string nameSpace = sltDataBaseType[1].Trim();
Assembly assembly = Assembly.Load(asselblyName);
DataExecutor execObj = assembly.CreateInstance(nameSpace) as DataExecutor;
execObj.SetConnectionString(connStrKey);

return execObj;
}
}

到此为止,数据访问层最终完成,当然这里还有很多问题有待解决,但其基本框架已形成了,以此为依据,根据业务变化,实现自己的扩展,不断更新,最终才能真正形成完善的数据访问层。

下面提供本文的示例代码:
 数据访问层示例

转载于:https://www.cnblogs.com/FlySoul/archive/2011/05/08/2040292.html

打造自己的数据访问层(三)相关推荐

  1. 打造自己的数据访问层(二)

    上一篇打造自己的数据访问层(一)中,我们已了解了.NET对数据库操作的基本原理,并就Ado.net对象的使用提出了几点疑问: 1.如何由系统来判断数据库型. 2.如何消除这些重复代码. 而上篇中也提出 ...

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

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

  3. CYQ.Data 轻量数据访问层(一) 概述

    在很久很久以前.2007年底,我曾发布过CYQ.Data.DLL,那时的学术氛围很浓,评论的也比较重 在那里,我曾做过一些简介与使用方法的帮助 在这个系列中,我将一步一步开源并讲解实现的过程,由于文章 ...

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

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

  5. ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发

    为什么80%的码农都做不了架构师?>>>    ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发          前言:本篇主要讲述数据访问层的开发, ...

  6. NHibernate3.2+Asp.net MVC3+Extjs 4.0.2项目实践(二): NHibernate数据访问层实现

    关于NHibernate的ORM映射可以通过Hbm映射文件来完成,代码生成工具使得这一步骤变得简化:而NHibernate3.2版本集成Mapping-By-Code(代码映射),不同于其他映射方式, ...

  7. 解析数据访问层操作数据库的方式

    在数据访问层对数据库进行操作的设计上,主要有这么几种:拼接字符串,带构造参数的基本Sql语句,存储过程,视图等. 因为这次做系统主要是为了促进我们学习,所以在本次机房收费系统中,我分别尝试了这几种方式 ...

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

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

  9. petshop4.0 详解之三(PetShop数据访问层之消息处理) [转]

    三.PetShop数据访问层之消息处理 在进行系统设计时,除了对安全.事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量.数据流量.服务器 ...

最新文章

  1. 自动化部署必备技能—定制化RPM包[转载]
  2. 【BZOJ3997】[TJOI2015]组合数学 最长反链
  3. 重拾Javascript (四) KnockoutJs使用
  4. android 仿360浮动,Android--模仿360底部导航按钮
  5. 休眠事实:了解刷新操作顺序很重要
  6. linux看硬件配置命令,Linux查看硬件配置命令
  7. CakePHP中文手册【翻译】
  8. python画50个图-python 实现在一张图中绘制一个小的子图方法
  9. Docker教程小白实操入门(3)--如何启动一个已经停止的容器
  10. Intellij IDEA创建第一个项目的视频
  11. 计算二叉树的叶子结点个数
  12. Java实现提取拼音首字母
  13. ICA(独立成分分析)在信号盲源分离中的应用
  14. python如何导入背景图片_背景图片的正确导入方式
  15. 来了,来了,他来了,使用Github制作自己的在线简历(网页和PDF版)你都值得拥有
  16. 2022年11月100篇 diffusion models 扩散模型 汇总!
  17. 如何起Linux服务器的21端口,linux下开启ftp的21号端口
  18. vue2.x的h函数(createElement)与vue3中的h函数
  19. 怎么用计算机管理你的外卖订单,外卖系统怎么确定收到订单 外卖接单软件怎么做...
  20. mac 修改java版本_Mac如何更改maven的java版本

热门文章

  1. python用动态规划求删除路径_Python | 动态规划求解TSP
  2. linux 执行sh_linux下执行脚本 sh -x XXX.sh 调试中存在大量/r 的问题
  3. oracle ebs 安装教程,Oracle_EBS_系统安装以及维护.doc
  4. 802.11 n wlan linux驱动下载,802.11n无线网卡驱动
  5. 中艺人脸识别考勤机使用方法_人脸识别考勤机的使用方法及注意事项 - 全文
  6. qt int转换成qstring_Qt 加载cern-root库 并调用root类
  7. put url带参数_一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?...
  8. 十五、java的基本数据类型
  9. Windows 服务程序编写
  10. PyTorch之torch.nn.Softmax()