最近做的一个项目,我最开始选用的是 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

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2007/01/02/610121.html如需转载请自行联系原作者

xiaotie 集异璧实验室(GEBLAB)

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

  1. 如何做到在虚拟数据库和真实数据库之间自由切换?【低调赠送:QQ高仿版GG 4.4 最新源码】...

    记得以前在公司上班时,有时候白天的活没干完,我就会把工作带回家晚上加班继续做.但是,我们开发用的数据库是部署在公司局网内部的一台服务器上的,在家里是肯定连不上这台机器的.在家里没有数据库,服务端就跑不 ...

  2. 使用多态来实现数据库之间的切换

    1.一般数据库之间的转换时这样实现的 static void Main(string[] args){//必须引入System.Data程序集string connectionString = Con ...

  3. mysql 迭代更新_MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)

    MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...

  4. 如何实现Oracle数据库之间的数据同步?

    我们都知道,在Oracle数据库的管理与开发工作中,总会存在着一些表数据和基础资料数据,这时需要有效的将这些数据库进行同步合并,有没有什么简单的方法可以实现Oracle数据库之间的数据同步呢?在此诚恺 ...

  5. 如何实现两个数据库之间的同步

    两台服务器分别架在两个不同的机房,要实现所有表中数据的同步,延时一两分钟没关系,数据库数据量很大,表大概有不到一百个吧,怎么实现同步?不同服务器数据库之间的数据操作--创建链接服务器 execsp_a ...

  6. oracle两个数据库之间,如何实现oracle两个数据库之间的同步

    如何实现oracle两个数据库之间的同步 关注:166  答案:2  手机版 解决时间 2021-01-23 22:02 提问者美人如画皮 2021-01-23 13:26 如何实现oracle两个数 ...

  7. 比较和同步两个SQL Server数据库之间的图像

    介绍 (Introduction) Sometimes we lose data by mistake and we want to compare the data with older backu ...

  8. oracle数据库集群采用的是形式,铁道部采用Oracle集群数据库进行TMIS系统“三级建库”...

    综述 铁道部利用Oracle9i集群数据库系统(Oracle9i RAC),顺利开展铁道部运输管理信息系统(TMIS)的"三级建库"工程--在各铁路局和铁路分局利用Oracle9i ...

  9. php 集成 spss,〖SPSS Modeler〗 IBM SPSS Modeler 整合不同数据库之间的数据

    来自IBM DEVELOPERWORKS 简介 由于目前企业客户的业务量和数据量都在不断的提高,随着企业的发展,很多企业的数据存储都不局限于同一个数据库上,如果要对这些存储在不同数据库上的数据进行处理 ...

  10. 业务逻辑与数据库之间缓存层

    业务逻辑直接与数据库进行交互,这样将会严重影响系统的整体性能,因此在业务逻辑与数据库之间引入一层缓存层,当需要向数据库中添加数据实体时,先将数据实体对象放入到缓存,并将实体对象放入到队列中,以进行持久 ...

最新文章

  1. R语言与数据分析(9)R与Excel
  2. 【c语言】蓝桥杯算法提高 三角形面积
  3. pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法
  4. 托管数据中心之间的PUE比较(下)
  5. c#入门经典笔记第十章
  6. 函数的参数-列表使用+=本质上是调用extend方法
  7. boost::scoped_ptr与std::unique_ptr
  8. C++ I/O流 格式控制(下)
  9. 如何成为一位黑客 ( How To Become A Hacker )
  10. ktv服务器操作系统,开源ktv客户端服务器系统
  11. java中常用的数据结构_Java中常用的数据结构类
  12. Git-第N篇碰见的一些问题
  13. 安卓 电话黑名单拦截
  14. 多线程练习题(双色球)
  15. 2022 年 React Native 的全新架构更新
  16. 企业微信应用消息html标签,消息类型及数据格式
  17. Python矩阵计算-Numpy
  18. 喜马拉雅自研网关架构演进过程
  19. 你听过哪些与房东有关的悲催的故事?
  20. 苹果11是高通基带吗_iPhone11信号成最大问题,不支持5G还是英特尔基带,令人失望...

热门文章

  1. 矩阵论作业4,5,6讲
  2. 【POJ 2104】【主席树模板题】K-th Number
  3. 【POJ 3279】【开关问题】Fliptile【暑期 No.5】
  4. 什么是OM3、OM4光纤跳线?
  5. Raki的读paper小记:SimCSE: Simple Contrastive Learning of Sentence Embeddings
  6. effective java 枚举_Effective.Java第34-44条(枚举)
  7. iic标准c语言,I2C总线之(三)---以C语言理解IIC
  8. android画板笔锋实现
  9. Linux驱动之异步OR同步,阻塞OR非阻塞概念介绍
  10. Apache VirtualHost的配置