在咱们开发不少项目中,数据访问都是必不可少的,有的须要访问Oracle、SQLServer、Mysql这些常规的数据库,也有可能访问SQLite、Access,或者一些咱们可能不经常使用的PostgreSQL、IBM DB二、或者国产达梦数据库等等,这些数据库的共同特色是关系型数据库,基本上开发的模型都差很少,不过若是咱们基于ADO.NET的基础上进行开发的话,那么各类数据库都有本身不一样的数据库操做对象,微软企业库Enterprise Library是基于这些不一样数据库的操做作的抽象模型,适合多数据库的支持项目。本文介绍基于微软企业库Enterprise Library 4.1的基础进行的多种数据库的处理。html
在选择Enterprise Library版本的时候,我一直都是相对谨慎,由于咱们开发的项目涉及不少不一样的系统,有的须要XP的支持、有的须要Win7的支持或者Win10等等,须要考虑不一样系统之家的兼容问题,因为微软企业库中的数据库访问模块相对比较稳定,所以也基本沿用使用稳定的版本,虽然目前Enterprise Library版本为6.0,可是以前一直在项目中使用的是3.1,这个版本能够在.NET 2.0的项目上运行,并且扩展类库也比较不错,所以一直保留着。mysql
随着框架版本的升级,在XP上最高能够运行.NET 4.0的版本,所以能够考虑使用Enterprise Library 4.1或者5.0的版本(Enterprise Library 6.0版本须要.NET 4.5的支持,没法再XP上运行),相对来讲,Enterprise Library4.1的扩展类库支持很是不错(http://entlibcontrib.codeplex.com/releases/view/38988),支持了SQLServer、DB二、MySql、ODP.NET(Oracle)、PostgreSQL、SQLite、SqlEx等数据库,而Enterprise Library 5.0版本扩展类库的支持尚未完整提供,须要本身处理。sql
所以综合上面的缘由,咱们为了照顾XP、Win7/Win8/Win10等不一样系统的兼容性,能够从目前的Enterprise Library 3.1升级到Enterprise Library 4.1,这样能够利用较好的扩展类库的支持(支持支持了SQLServer、DB二、MySql、ODP.NET(Oracle)、PostgreSQL、SQLite、SqlEx等数据库),也相对提升下该数据访问模块的版本。数据库
在我之前绘制的多数据库支持里面调整一下,把咱们采用微软企业库后,支持的数据库做为数据层,示意图以下所示。编程
这样基本上常规的关系型数据库咱们都支持了,咱们须要开发任何数据库应用,都是统一数据模型,开发起来方便不少了,同时也方便在不一样数据库管理系统中进行配置切换。架构
采用了微软企业库Enterprise Library做为咱们底层的数据库访问模块后,对于多种数据库的访问操做,就会统一采用这个企业库的数据库访问对象,操做起来很是一致,为了对不一样数据库的常规增删改查等一些操做进行进一步的封装,已达到简化代码的目的,所以咱们能够为每一个不一样的数据库定义一个数据访问操做基类,以便实现一些不一样数据库差别性的处理,可是它们仍是有一个共同的数据访问基类。app
采用不一样的数据库,咱们须要为不一样数据库的访问层进行生成处理,如为SQLServer数据的表生成相关的数据访问层DALSQL,里面放置各个表对象的内容,不过因为采用了相关的继承类处理和基于数据库的代码生成,须要调整的代码不多。框架
针对数据访问层,咱们须要设计好对应的继承关系,以便使得咱们的基类可以封装大多数的操做,并给子类相对的弹性处理空间,如对于客户Customer的对象,数据接口层和数据访问实现层的关系以下所示。ide
这样整合多种数据库支持的底层后,整个数据访问的架构设计以下所示。sqlserver
关于这个架构,我在前面不少文章都有阐述,若是咱们还须要扩展一些特殊的数据库支持,能够参考随笔《基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操做》进行一些扩展定制的操做。
前面咱们提到,使用微软企业库Enterprise Library的好处就是能够统一编程模型,实现对多种数据库的兼容处理,而微软企业库Enterprise Library最大的特色是基于配置项实现多种数据库的处理,经过对使用不一样的配置项,就能够迅速切换到对应的数据库上来,代码不须要修改。
对于通常的企业库配置处理,咱们增长配置项以下所示。
<configSections> <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/> </configSections>
而后为不一样的数据库添加不一样的链接字符串
对于默认支持的SQLServer数据库,它的链接字符串以下所示。
<?xml version="1.0"?> <configuration> <configSections> <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data"/> </configSections> <connectionStrings> <!--SQLServer数据库的链接字符串--> <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=WinFramework;Integrated Security=SSPI"/> </connectionStrings> <dataConfiguration defaultDatabase="sqlserver"> </dataConfiguration> </configuration>
不过对于一些扩展支持的数据库,咱们还须要添加一些映射处理,如对于MySQL的支持,咱们须要添加链接字符串:
<!--MySQL数据库的链接字符串--> <add name="mysql" providerName="MySql.Data.MySqlClient" connectionString="Server=localhost;Database=WinFramework;Uid=root;Pwd=123456;"/>
还须要添加ProviderMappings的支持,以下所示的XML。
<dataConfiguration defaultDatabase="mysql"> <providerMappings> <add databaseType="EntLibContrib.Data.MySql.MySqlDatabase, EntLibContrib.Data.MySql" name="MySql.Data.MySqlClient" /> </providerMappings> </dataConfiguration>
下面我列出全部不一样数据库的链接字符串以及映射关系的一个完整版本,供参考。
前面咱们提到了,基于配置实现不一样数据库的统一处理,咱们为了测试不一样数据库的链接,咱们可使用下面的简单案例代码来获取数据进行展现。
其实现的代码以下所示。
咱们看到,上面的代码没有针对具体的数据库,所以也是很是通用的处理,咱们能够直接获取数据并展现出来,我上面案例在SQLServer、Oracle、PostgreSQL、MySQL、SQLite、Access、IBM DB2数据库均测试经过。
具体开发项目的时候,不一样数据库有一些不一样的处理,如分页操做、获取指定记录的处理等等,这些咱们就须要发挥上面提到的数据库基类的功能了,经过基类功能的封装,咱们能够除了可使用全部数据库的共性外,还可使用它的一些特定处理操做,这样咱们就能够充分利用各类不一样数据库的特色,可是又统一到一个开发模型上来,下降了各类不一样数据库之间开发的成本,同时也减小不一样数据库之间的迁移难度,提升代码的可阅读性和可扩展性。
上面关于数据库访问模块的框架构建,已经在我众多的Winform项目、Web开发项目,以及一些后台服务项目上运行良好,并使用了多年,为咱们开发各类不一样数据库,或者升级到不一样数据库版本的处理工做上立下了汗马功劳。