• 基于IDbConnection接口实现修改配置文件切换数据源


    功能背景

    你用经典的ASP.NET+SqlServer做了一个新功能给Boss看,希望得到他的赞赏,谁知道,恶毒的Boss说,我们要考虑周全,你把他修改成也可以用Oracle数据库,程序猿只好苦逼的回去,修改了一番再拿给Boss,一看还不错,但是如果兼顾到Access数据库就更好了。程序员彻底疯狂了!

    最普通的做法

    我们都知道,如果使用SqlServer数据库,则会使用using System.Data.SqlClient下相关的类,如:SqlConnection;
    如果使用Oracle作为数据库,则会使用到System.Data.OracleClient命名空间下相关类,如:OracleCommand;等等……
    普通的做法是:判断使用的是哪种类型的数据库,然后new相关的数据库连接类Connection,然后new出相关的数据库操作类Command这样子;当你做完这一步之后,你会发现,其实大部分的代码都是一样的,不同的只是SqlConnection,OracleConnection,OleDbConnection……等等这些与数据库类型相关的类。所以你可能会写出下面这样的代码:

    string type = Console.ReadLine();
       if (type == "SQLServer")
       {
           using (SqlConnection conn = new SqlConnection("数据库连接字符串"))
           {
               conn.Open();
               using (SqlCommand cmd = conn.CreateCommand())
               {
                   //相关数据库操作
               }
           }
       }
       else if (type == "Oracle")
       {
           using (OracleConnection conn = new OracleConnection("数据库连接字符串"))
           {
               conn.Open();
               using (SqlCommand cmd = conn.CreateCommand())
               {
                   //相关数据库操作
               }
           }
       }
       else
       {
           throw new Exception("没有相关的数据库源");
       }
    

      

    基于IDbConnection接口编程

    为了避免更换数据库大量修改代码和重复判断数据库类型,我们决定使用基于接口编程的方法来实现:
    首先介绍:IDbConnection这个接口,使用查看定义你就会发现,SqlConnection,OracleConnection,OleDbConnection等类都继承自DbConnection类,而DbConnection类实现了IDbConnection这个接口,接口定义了很多通用的方法如:Open(),Close()等抽象方法让实现该接口的类去重写。

    第一步:配置文件
    利用providerName这个属性标注是哪种类型的数据库,代码里通过他来判断

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="connstr" connectionString="" providerName="Access"/>
      </connectionStrings>
    </configuration>
    

      

    第二步:接口编程
    IDbConnection按继承辈分来说,应该是各个数据库操作类的祖父,当然,我们可以用父类对象变量指向子类对象的方法使用,

    private void button1_Click(object sender, EventArgs e)
    {
        string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
        //多种数据库切换
        IDbConnection conn;
        string provideName = ConfigurationManager.ConnectionStrings["connstr"].ProviderName;
        if (provideName == "Access")
        {
            conn = new OleDbConnection(connstr);
        }
        else if (provideName == "SQLServer")
        {
            conn = new SqlConnection(connstr);
        }
        else
        {
            throw new Exception("未知的ProvideName");
        }
        using (conn)
        {
            conn.Open();
            using (IDbCommand cmd= conn.CreateCommand())
            {
                cmd.CommandText = "Insert into XXXXX";
                cmd.ExecuteNonQuery();
            }
        }
        MessageBox.Show("Success");
    }
    

    因为很多种数据库连接类,比如OleDbConnection,SqlConnection都继承自DbConnection,而DbConnection则实现了IDbConnection 接口,使用接口变量来指向各自的数据库连接对象,更使得通用,但是,使用接口变量则无法调用各自私有的东西,比如OleDbConnection类下有某个属于自己的方法A(),使用接口变量则无法调用A(),但是,可以类型转换为OleDbConnection对象再来使用。

  • 相关阅读:
    NDK中使用pthread多线程中自己写的一个BUG
    Android Native crash日志分析
    Android细笔记--DataStorage
    求二叉树第n层节点数
    对YUV数据进行裁剪
    Android XML中引用自定义内部类view的四个why
    Android细笔记--ContentProvider
    Android Log Tag含义
    189-RotaeArray
    二分查找法
  • 原文地址:https://www.cnblogs.com/waynechan/p/2705096.html
Copyright © 2020-2023  润新知