采用C#泛型实现数据库之间的切换

    最近做的一个项目,我最开始选用的是 MySql 5.0 数据库,项目提交之后,对方要求换成 MS SQLServer 2000,还好数据层操作基本采用的是标准的SQL语句,也未使用存储过程,于是将原有的数据接入层代码改写成泛型类,只改了不到一百行代码,具体的SQL操作语句一句未动,便实现了数据库之间的切换。下面简述:

    数据库不是很复杂,因此我采用了两个类:

(1) DataProvider 泛型类

public class DataProvider<ConnType, CmdType>
    where ConnType : IDbConnection, 
new()
    where CmdType : IDbCommand,
new ()
{
    
}

    提供数据库表的Insert,Update,Select,Delete操作。
    因为 IDbCommand能够由 IDbConnection 获取,其实只需要有一个泛型参数ConnType 的,不过这样以来,具体的代码改动比较大,偶就采用了两个泛型参数。

(2)ConnectionPool 泛型类

public class ConnectionPool<T>
        where T : IDbConnection,
new ()
{
    
}

    最开始没在MySql 5.0 中找到对数据库连接池的支持,于是自己写了一个简单的数据库连接池。

    下面,就是采用 C# 的NB语法――using:

(1)如果使用 MySql 数据库:

using DataProvider = DataProvider<MySql.Data.MySqlClient.MySqlConnection, MySql.Data.MySqlClient.MySqlCommand>;

(2)如果使用 SQLServer 数据库:

using DataProvider = DataProvider<System.Data.SqlClient.SqlConnection, System.Data.SqlClient.SqlCommand>;

    这样一来,其它地方的代码一句都不用动了。

    懒惰是程序员的美德。我的一台电脑上装的是 SQLServer 2000数据库,一台电脑上装的是 MySql数据库,我经常一会在这台电脑上干活,一会在另外一台电脑上干活,两个电脑上的代码应该一致啊。因此,采用预编译指令:

#if MSSQLSERVER
using System.Data.SqlClient;
using DataProvider = DataProvider<System.Data.SqlClient.SqlConnection, System.Data.SqlClient.SqlCommand>;
#elif MYSQL
using MySql.Data;
using DataProvider = DataProvider<MySql.Data.MySqlClient.MySqlConnection, MySql.Data.MySqlClient.MySqlCommand>;
#endif

    这样在编译时指定条件编译符号 " MYSQL " 得到的就是MySql版本的代码,指定条件编译符号" MSSQLSERVER ",得到的就是 SQLServer 版本的代码。

    其它:

    (1)理论上来说,采用反射得到的解决方案更完美,不过那样工期会更长,没必要啦啦啦啦啦啦。。。。。。。。。。。。。

    (2)数据库设计,偶采用的是免费软件 Toad Data Modeler 免费版,里面提供了数据库切换功能,切换过去,稍微改动改动。

    (3)这次开发工具采用的全是开源软件或者免费软件,都是超级好用的东东,感觉开发速度并不比庞大的收费软件慢。用到的工具如下:
    IDE:VS 2005 Express (C++版,C#版,Web开发版),.Net的aspnet命令行编译工具
    版本管理:SVN,小乌龟SVN Client
    Shell:Windows Power Shell(这玩意既然出来了,就要充分利用)
    UML建模:StarUML(功能强大的开源UML,比偶以前用过的JUDE,ArgoUML强大很多,支持C#)
    数据库建模:Toad Data Modeler 免费版
    数据库管理工具:EMS SQL Manager 2005 lite for MySQL

posted @ 2007-01-02 18:03 xiaotie 阅读(3857) 评论(22)  编辑 收藏 网摘 所属分类: [语言]CLI(.NET)[ 藏 ]开源软件

  回复  引用    
#1楼2007-01-02 20:28 | justin[匿名][未注册用户]
请问您说的tode在那里有的下载?
  回复  引用  查看    
#2楼[楼主]2007-01-02 23:10 | xiaotie      
写错了,是 Toad Data Modeler :
www.casestudio.com/enu/database_design_freeware.aspx

  回复  引用  查看    
#3楼2007-01-03 00:01 | ZergTant      
支持下
类似petshop的反射的方法能增加灵活性但是会降低一些效率

  回复  引用  查看    
#4楼2007-01-03 00:17 | Edward.Net      
使用这种方法不能在软件实施的过程中修改数据库类型,而只能在开发的时候已经在程序中规定了的。对项目开发来说可能会有意义,但是对产品来说只有使用反射才可以。
  回复  引用    
#5楼2007-01-03 08:04 | Baige[匿名][未注册用户]
可以通过把连接串放到配置文件里,程序中以接口的方式实现。
  回复  引用    
#6楼2007-01-03 08:13 | haha[匿名][未注册用户]
这个东东你怎么解决:
@和:

还有Top

  回复  引用  查看    
#7楼2007-01-03 09:02 | 银河      
好文章.

  回复  引用  查看    
#8楼2007-01-03 09:28 | Anders.Zhao      
用Express也能开发项目?支持哈,有机会多多交流下,我的MSN:f5_zj#yahoo.com.cn
  回复  引用    
#9楼2007-01-03 09:31 | roydux[未注册用户]
这个东东你怎么解决:
@和?



  回复  引用    
#10楼2007-01-03 10:47 | 搬场[未注册用户]
可以通过把连接串放到配置文件里,程序中以接口的方式实现
  回复  引用    
#11楼2007-01-03 10:48 | 搬家[未注册用户]
用Express也能开发项目?支持哈,有机会多多交流下
  回复  引用    
#12楼2007-01-03 10:49 | 搬家[未注册用户]
使用这种方法不能在软件实施的过程中修改数据库类型,而只能在开发的时候已经在程序中规定了的。对项目开发来说可能会有意义,但是对产品来说只有使用反射才可以。
  回复  引用  查看    
#13楼2007-01-03 14:44 | 随心所欲      
这只是纯技术。

如果作应用的话,最还有专门的provider去实现。
1:灵活。可以写各种针对性地sql
2:扩展性好

  回复  引用  查看    
#14楼[楼主]2007-01-03 15:44 | xiaotie      
@Baige[匿名]
这样更改量会比较大。目前是把连接字符串放在配置文件中,采用泛型,更改量小很多。

  回复  引用  查看    
#15楼[楼主]2007-01-03 15:46 | xiaotie      
@Anders.Zhao
免费版已经够了。

  回复  引用  查看    
#16楼2007-04-09 14:07 | yunhuasheng      
不错,楼主真厉害,泛型用的好。
  回复  引用    
#17楼2007-06-27 16:10 | 上海网站制作[未注册用户]
不错,楼主真厉害,泛型用的好。 回复 更多评论

  回复  引用  查看    
#18楼2007-07-27 13:01 | 镜涛      
顶,借鉴!
  回复  引用  查看    
#19楼2007-10-26 16:36 | l      
谢谢,博主的分享值得我学习,以你为榜样
  回复  引用    
#20楼2008-02-18 16:49 | deer[未注册用户]
不错,楼主真厉害,建议看看这篇文章写的比较详细 http://www.150it.cn/bianchengwendang/Csap/5018299.html
  回复  引用    
#21楼2008-04-17 09:53 | Annue[未注册用户]
Toad Data Modeler 免费版 可否共享下?
  回复  引用    
#22楼2008-10-16 18:49 | OhmyGod[未注册用户]
Windows Power Shell 在这里面扮演什么角色?



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 610121




相关文章:

相关链接: