开发者社区> walb呀> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

换一种思维实现数据库切换

简介:
+关注继续查看

一、理论:

          这里例举OracleDAL和SqlServerDAL。

          将OracleDAL的dll名称设置为DAL.OracleDAL.dll,将SqlServerDAL名称设置为DAL.SqlServerDAL.dll,但是两者内部的类名、方法名以及命名空气名称完全一样。也就是说,比如class:OracleDAL有一个Insert方法,那么就将他的类名称改成DAL,Insert名称不变(如果标示了如OracleInsert,最好改成与数据库不相关的名称);而class:SqlServerDAL也同样将类名改成DAL,外部方法需要和OracleDAL一直。这样一来,我们同时引用两个dll会报错,我们只能引用一个dll,也就是我们切换数据库的时候只用替换一下dll就可以了,不必用反射来了,由此大家也能看到冗余。但是仍然可以优化,理想的情况下,可以抽出一个中间的dll(DAL.dll)来封装两者相同的代码以及标准接口,而DAL.OracleDAL.dll和DAL.SqlServerDAL.dll都依赖并遵循于DAL.dll,这样能规范约束并且减少冗余。

二、实施:

          通过反射达到无缝切换:更改数据库连接字符串+更改表示当前数据库的配置文件(一般都是如此做法)。

          通过标准+冗余到无缝切换:更改数据库连接字符串+更换dll。

三、简单示例:

          1.     DAL.Oracle.dll

               1.1     OracleDAL.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OracleClient;

using Model;

namespace Data
{
    
//public class OracleDAL
    public class DAL
    {
        
public void Insert(IModel model)
        {
            OracleCommand cmd 
= new OracleCommand("connectionstring");
            cmd.CommandText 
= "Insert into test(column1,column2) values(@column1,@column2)";
            
//cmd.Parameters
            cmd.ExecuteNonQuery();
        }
    }
}

          2.     DAL.SqlServer.dll

               2.1     SqlServerDAL.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;

using Model;

namespace Data
{
    
//public class SqlServerDAL
    public class DAL
    {
        
public void Insert(IModel model)
        {
            SqlCommand cmd 
= new SqlCommand("connectionstring");
            cmd.CommandText 
= "Insert into test(column1,column2) values(@column1,@column2)";
            
//cmd.Parameters
            cmd.ExecuteNonQuery();
        }
    }
}

          3.     业务层/客户端调用代码

    using Data;

    
public class Program
    {
        
static void Main(string[] args)
        {
            IModel model 
= new Model();
            
new DAL().Insert(model);
        }
    }
   

四.     代码说明和分析

               3.1     代码不能直接执行,主要是为了表达本文的意图,希望你理解后自己再写具体的代码试试看。

               3.2     需要注意的是1和2分别是两个dll,类的文件名不同,但是类名和空间名称是一样的,所以项目中只能存在一个。

               3.3     需要注意的是,Insert在两个dll里面方面名称、类名、命名空间是一样的,但是方法内部实现并不是一样的!!

               3.4     如果我现在进行数据库切换,把DAL.SqlServer.dll和DAL.Oracle.dll两个之间任意的替换掉业务层调用方是不用更改任何代码的!!因为类名、命名空间、方法都没有变!!

 

小结

     由此可见,对于业务层,由于两者命名空间、类名、方法名一致,在更换dll的时候是无需改动代码的,并且性能也是要优于通过反射来实现数据库切换的,而且具有更强的可扩展性和随意性,可将现有的不跨数据库的代码改改就可以下次复用了,在写其中任何一个针对数据库的dll的时候只要根据标准,就无需考虑数据库兼容的问题了。

     但是需要注意的是,在我们需要强类型(如SqlDataReader、SqlCommand)、直接执行SQL语句的时候就需要和其他程序一样需要仔细设计了,比如对于SqlDataReader,不直接进行返回,或者给方法返回加一个泛型支持,并约束泛型调用类必须也继承IDataReader接口,或者干脆直接返回一个Hashtable或Dictionary;而SQL语句可以对应的建立一个SQL语句的工厂类,传一个结构体过来,然后根据结构体来生成SQL语句,而不要直接写SQL语句来执行。

本文转自博客园农民伯伯的博客,原文链接:换一种思维实现数据库切换,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数学思维修炼
《程序员的数学思维修炼(趣味解读)》、《生活中的数学》和《生活中的概率趣事》,下面会对本书的知识点做个梳理。
31 0
面向对象的思维方式
面向对象 是一种思维方式,也是一门程序设计技术 通俗的说,当你要解决一个问题前,首先考虑的是 由谁 来做,而我们自己不考虑怎么做的,怎么做是这个 谁 的职责,最后把事情解决就行。
1048 0
数据结构思维 第一章 接口
第一章 接口 原文:Chapter 1 Interfaces 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本书展示了三个话题: 数据结构:从 Java 集合框架(JCF)中的结构开始,你将学习如何使用列表和映射等数据结构,你将看到它们的工作原理。
860 0
大数据如何玩儿?BAT思路迥异
大数据应用实践,硕果累累 百度在大数据方面让人印象深刻的有百度迁徙这样的公益项目,应用在民生和新闻等领域。最新动态是,百度网盟利用基于大数据的CTR(广告内容匹配)数据,站长的平均收入提升70%。
1333 0
+关注
1038
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载