利用接口实现多种数据库类型的灵活更换

当存在可能要更换数据库类型的时候,要考虑两个问题:

一,不同类型的数据库命名空间不一样,用到的函数名也不一样,尽管很相似;

二,有些SQL语句在不一样的数据库之间是不通用的!

那么要在更换数据库类型的时候,如何做到尽量少受因为上面两点而造成的影响呢?!利用接口,可以将第一点的影响降到最低!至于第二点,
可以将数据的操作尽量在数据库服务器端实现,这点的探讨不在本文研究范围内,在此也就不多说!下面主要就利用接口将第一点的影响降到最低这一点进行详细说
明。

首先,明确两点:

1, 无论哪种数据库类型,对数据库的操作,都是那几种:执行SQL、执行带参数的SQL、执行存储过程、执行带参数的存储过程等(这里的操作划分方式,根据不一样的开发人员有不一样的习惯,例如有些人习惯分:添加、编辑、删除、获取这几种,但这不会有影响);

2, 不一样的数据库类型,有不一样的命名空间、函数名,当更换数据库类型时,这些命名空间、函数名也是必须更换的。

要降低影响,即,对不一样的命名空间、函数名的更改次数降到最低,同时不必要对其他模块进行变动!本人的做法是:定义一个接口,声明了
一些对数据库操作的方法;每种数据库类型定义一个类来实现这些接口;再定义一个所有数据库的统一入口!这样,要更换数据库类型的时候,只需要定义一个新
类,重新实现那些接口即可!其他的无须修改!

下面,举个例子说明。

接口:

namespace DataEvent
{
    /// <summary>
    /// 数据库操作接口
    /// </summary>
    public interface IDataAccess
    {
        ///<summary>
        /// 执行Sql语句
        ///</summary>        
        /// <param name="sql">Sql语句</param>         
        ///<returns>返回影响的行数</returns>
        int ExceSql(string sql);

Access数据库类

namespace DataEvent
{
    public class AccDataAccess : IDataAccess
    {
        public int ExceSql(string strSql)
        {
            string t_str = "AccessSql:" + strSql;
            return t_str.Length;
        }
    }
}

Sql Server数据库类

namespace DataEvent
{
    /// <summary>
    /// sql server 数据库操作类
    /// IDataAccess接口的实现
    /// </summary>
    public class SqlDataAccess : IDataAccess
    {
        public int ExceSql(string strSql)
        {
            string t_str = "Sql:" + strSql;
            return t_str.Length;
        }
    }
}

Oracle数据库

namespace DataEvent
{
    /// <summary>
    /// oracle 数据库操作类
    /// IDataAccess接口的实现
    /// </summary>
    public class OraDataAccess : IDataAccess
    {
        private OracleDataAdapter dbAdapter = null;

        private OracleDataAdapter SqlAdapter
        {
            get
            {
                if (dbAdapter == null)
                    dbAdapter = new OracleDataAdapter();
                return (dbAdapter);
            }
        }

        public int ExceSql(string strSql)
        {
            string t_str = "Oracle:" + strSql;
            return t_str.Length;
        }
    }
}

统一入口:

namespace DataEvent
{
    /// <summary>
    /// 所有数据库操作的统一入口
    /// </summary>
    public static class CommonAccess
    {
        private static readonly string dataAccessType = ConfigurationSettings.AppSettings["DataAccessType"];
        private static IDataAccess _obj;
        private static IDataAccess Obj
        {
            get
            {
                if (_obj == null)
                {
                    string m_className = "DataEvent." + dataAccessType;
                    _obj = (IDataAccess)Assembly.Load("DataEvent").CreateInstance(m_className);
                }
                return _obj;
            }
        }
        /// <summary>
        /// 测试
        /// </summary>
        /// <returns>返回一个字符串</returns>
        public static int ExceSql(string strSql)
        {
            return Obj.ExceSql(strSql);
        }
    }
}

测试,按钮事件:

private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(DataEvent.CommonAccess.ExceSql("ExceSql Result!").ToString());
        }

Access

数据库时,”AccessSql: ExceSql
Result!”字符串有25个字符!

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="DataAccessType" value="AccDataAccess"/>
  </appSettings>
</configuration>

显示结果:25

更换为Oracle数据库时(更换数据库时,只需要在配置文件里修改配置字符串”DataAccessType”的Value值即可!),”Oracle:
ExceSql
Result!”字符串只有22个字符!

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="DataAccessType" value="OraDataAccess"/>
  </appSettings>
</configuration>

显示结果:22

在实际开发中,不一定就存在这种经常更换数据库类型的情况,但,将这些可能性考虑进来,有利于提高系统的灵活性.同
时,这里举这个例子,也是希望能起到抛砖引玉的作用.希望的是以后能拥有这种思想,随时随地考虑到系统的灵活性,重用性等.本人资质尚浅,写的是自己目前
能感悟到的东西,有什么不妥,还望高人指指点点

利用接口实现多种数据库类型的灵活更换,布布扣,bubuko.com

时间: 05-29

利用接口实现多种数据库类型的灵活更换的相关文章

Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持 - 伍华聪

在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型.还有一种情况,由于业务数据库的不断膨胀或者方便数据库的切割隔离,有时候也会把不同的业务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此在一个系统里面,同时使用2个或者以上的数据库的情况也是有的.针对这两种情况,本文介绍在我的Winform开

Winform开发框架中实现同时兼容多种数据库类型处理

在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型.还有一种情况,由于业务数据库的不断膨胀或者方便数据库的切割隔离,有时候也会把不同的业务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此在一个系统里面,同时使用2个或者以上的数据库的情况也是有的. 在我较早期的一篇随笔<Winform开发框架

[Effective JavaScript 笔记]第57条:使用结构类型设计灵活的接口

想象创建wiki的库.wiki网站包含用户可以交互式地创建.删除和修改的内容.许多wiki都以简单.基于文本标记语言创建内容为特色.通常,这些标记语言只提供了HTML可用功能的一个子集,但是却有一个更简单.更清晰的源格式.例如,环绕星号的文本被格式化为粗体,环绕下划线的被格式化为带有下划线的文本,环绕斜杠的被格式化为斜体.用记可以输入如下格式: this sentence contains a *bold phrase* within it. this sentence contains a _

spring+mybatis利用interceptor(plugin)兑现数据库读写分离

使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是“地位相当”的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这几台数据库服务器之间进行合理分配, 这个时候,通过统一的一个DataSource来屏蔽这种请求分配的需求,从而屏蔽数据访问类与具体DataSource的耦合: 系统中存在的多台数据库服务器现在地位可能相当也可能不相当,但数据访问类在系统启动时间无法明确到底应该使用哪一个数据源进行数据访问,而必须在系统运行期间通过某种条

在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreSQL.IBM DB2.或者国产达梦数据库等等,这些数据库的共同特点是关系型数据库,基本上开发的模型都差不多,不过如果我们基于ADO.NET的基础上进行开发的话,那么各种数据库都有自己不同的数据库操作对象,微软企业库Enterprise Library是基于这些不同数据库的操作做的抽象模型,适合多数据

利用JDBC连接Oracle数据库(转)

http://blog.csdn.net/wahaha1_/article/details/8512438 JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员

利用JDBC连接Oracle数据库【转】

JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制. 1.跨平台运

Dapper.Contrib 开发.net core程序,兼容多种数据库

Dapper.Contrib 开发.net core程序,兼容多种数据库 https://www.cnblogs.com/wuhuacong/p/9952900.html 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 关于Dapper的介绍,我想很多人都对它有一定的了解,这个类似一个轻型的ORM框架是目前应用非常火的一个东西,据说各方面的性能都不错,而且可以支持多种数据库,在开始介绍这个文章之前,我花了不少功夫来学习了Dapper 的相关使用.Dapper.Con

【RMAN】利用备份片还原数据库(上)

[RMAN]利用备份片还原数据库 群里有同学说把ORACLE_BASE目录删掉了,现在只有备份片和归档文件了,试问如何恢复.坑,,,,咋能这么干,ORACLE_BASE都敢删,,试着恢复了下,并且记录下来,当然软件安装部分就不记录了. 我再说说目前的情况,只有备份片和归档文件,且从文件名称是看不出dbname和dbid的,在这种情况下其实恢复控制文件是很重要的了,但是鬼知道备份片里边是不是有控制文件的备份呢?我们可能碰到的就是这样的情况,只有备份文件,其它的什么都不知道.我们且看这样的情况下如何