现在的程序经常要求能兼容不同的数据库,常见的有Access,Sql2000,Sql2005,MySql,Oracle.虽然我不得不承认使用反射机
制,可以实现在web.config中改一改就能切换数据库,但对每种数据库都要实现一遍DAL的编写,无疑也是一大麻烦.
经过思考与测试,加上微软企业库带给我一点启发.终于弄出一个DBLibrary,可以无缝地兼容各种数据库.就像PetShop一样,改一改web.config就能换一个数据库类型,而又不像PetShop一样要逐个实现DAL!
首先必须满足的条件:各种SQL语句都必须使用T-SQL,否则这个问题就无从谈起,如果使用了特定数据库中的函数,就算实现了,这个DAL也必将非常复杂,这样获得的代价便是非常差的可维护性,当然也可以用存储过程,不过在Access中可没这么容易.
有了这个基础便好办了,先看看我写的DBLibrary的类结构图:
PageHelper:
这个只有一个方法:实现取得分页的SQL语句.如果你想用存储过程,把这里的唯一一个方法改一改即可.后面四个针对各种数据库的类都继承这个类.本来想着
针对不同的数据库各写一个分页的方法,查了查资料,虽然MySql和Sql2005都提供了专门的方法用来分页.不过在数据量大的时候,越往后分页,速度
也会明显变慢。这样看来,还不如用传统的"not in"的方法分页.
IDBHelper: 这里包含所有数据库操作的接口.同样,四个针对各种数据库的类都实现了这个接口.
下面的四个类就不介绍了,我把PetShop里的方法拿过来了,另外增加了三个方法:一个分页的方法,一个取得DataSet的方法,两个针对事务的方法.ps:也许PetShop没写全的原因是程序中没用到.
DBHelper: 这个最重要,上层要调用的就是这个.它包括:
字段:一个数据库连接,一个数据库类型,有了这两个
方法:创建DbParameter的方法,创建DbConnection的方法(因为上层可能用到事务,必须在上层创建连接,所以要用到此方法),由Object取值的方法(方便上层的GetModel,GetCount等方法)
好了,这个类库写好了,上层怎么用呢?非常地简单!
上层与数据库打交道时,所有的类型都使用DbConnection,DbTransaction,DbParameter这些低层的类,不使用由这些类继承的类.这样就不牵涉到是哪种数据库了.
首先创建一个DBHelper,前面说过这个类有两个属性,一个数据库连接,一个数据库类型,这两个都可以通过web.config中的数据库连接来得到.那么,我们先写一个类,创建这个DBHelper,让其它的数据库操作类都继承于这个类,还是看代码吧:
因为其它数据库操作的类都继承于这个类,那么这里的DBHelper在继承的类中都是可以使用的.因此所有的数据库操作与类的创建都通过刚才创建的DBHelper来实现.以NorthWind中的表Shippers中插入一行数据为例:
非常简单吧.里面看不到SqlDbType,取代的是DbType,也看不到SqlParameter,取代的是DbParameter,这样对任何数据库都是通用的.
源码及例子下载:https://files.cnblogs.com/yvesliao/Template.rar
此
例子已经通过Access(App_Data下的NorthWind.mdb),Sql2000(自带的
NorthWind),Sql2005(App_Data下的NorthWind.mdf)测试通过,你可以试试改web.config试试其它数据库,
改以下节点即可.
写这个篇文章,越发感到自己的语言表达能力差啊,好多都不知道怎么描述,有误之处,欢迎各位大虾指正.