zoukankan      html  css  js  c++  java
  • C#学习 通过基于接口的编程来实现数据库的切换

      昨晚有去想一下,实现数据库切换的其他方法。这个方法不是我想到,以前看过别人这么做过。然后回忆回忆着就写出来了。

      好了,说一下他实现的方法。当然他有一个比较大的缺点在后面说一下。在ADO.NET里有很多操作数据库的类。

      1、例如以MSSQLSERVER来讲就有SqlConnection、SqlDataReader、SqlCommand等操作数据库相关的类,只要你VS里面右键这些类名选转到定义,不停转到定义后会发现,SqlConnection实现的是IDbConnection接口,SqlDataReader实现IDataReader接口,SqlCommand实现的是IDbCommand接口。

      2、例如以Access来讲就有 OleDbConnection、OleDbDataReader、OleDbCommand等操作数据库相关的类,同样的转到定义后你也会发现OleDbConnection实现的是IDbConnection接口,OleDbDataReader实现IDataReader接口,OleDbCommand实现的是IDbCommand接口。

      3、如何你去看一下Oracle或再去下载一个MySQL数据库关于连接ADO.NET的DLL添加引用到你的项目,你也会发现他们都实现了相同的相应的接口。

      4、竟然他们实现了相同的相应的接口,那么我们就可以通过基于接口的编程来实现数据库的切换

      

      可是真的实现了后,发现一点问题也有没有么?其实不是的,各个数据库间的SQL语句是有些不相同,当然增删改查SQL语句是相同的,可是你要用SQL语句做一个分页,在MSSSQLSERVER里有他的实现方法,在MYSQL里又有他的实现方法,可能(我还没有接触过ORACLE)在ORACLE又有他的实现方法。例如在传参的时候MSSQLSERVER使用@参数名,但是ACCESS使用的是?号,再例如MSSQLSERVER里有SUBSTRING,当是ACCESS里没有,但能用ACCESS能用MID截字符串。所以各个数据库间SQL语句没有完全真正的统一,那么就没有办法做到数据库完美的切换。这是我自己的一点看法。一万个人心中有一万个哈姆雷特,你可能有你的看法。

      

      废话了这么多,可以贴一下代码了。。。因为代码量不多,没做什么解释,我想聪明的你,多看看就看懂了吧。

      

    实现过程

      做为例子,一切简单化,建一个WEB应用项目,取名为切换数据库DEMO。和两个类库,一个MODEL类库,一个DAL类库,这回用到了WEB.CONFIG的配置文件。如图所示:

      DAL的代码:

      

    using System.Data;
    using System.Data.SqlClient;
    using System.Data.OleDb;
    using Model;
    namespace DAL
    {
        public class CustomerDAL
        {
            string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
            string providerName = ConfigurationManager.ConnectionStrings["connstr"].ProviderName;
    
            IDbConnection conn = null;
    
            public bool Insert(Customer customer)
            {
                GetConnection();
                using (conn)
                {
                    conn.Open();
                    using (IDbCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "Insert into Customer(cName,cPhone) values('" + customer.CName + "','" + customer.CPhone + "')";
                        cmd.ExecuteNonQuery();
                        return true;
                    }
    
       
    
                }
            }
    
    
            public Customer Get(int id)
            {
                GetConnection();
                using (conn)
                {
                    conn.Open();
                    using (IDbCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "select * from Customer";
                        IDataReader dr = cmd.ExecuteReader();
                        DataTable dt = new DataTable();
                        dt.Load(dr);
    
                        Customer customer = new Customer();
                        foreach (DataRow row in dt.Rows)
                        {
    
                            customer.CName = dt.Rows[0]["cName"].ToString();
                            customer.CPhone = dt.Rows[0]["cPhone"].ToString();
                            customer.Id = id;
                        }
                        return customer;
                    }
                }
            }
    
            public void GetConnection()
            {
                if (providerName == "Access")
                {
                    conn = new OleDbConnection(connstr);
                }
                else if (providerName == "SQLServer")
                {
                    conn = new SqlConnection(connstr);
                }
                else
                {
                    throw new Exception("未知的providerName");
                }
            }
        }
    }
    

      MODEL的代码:

        public class Customer
        {
            private int _id;
    
            public int Id
            {
                get { return _id; }
                set { _id = value; }
            }
            private string _cName;
    
            public string CName
            {
                get { return _cName; }
                set { _cName = value; }
            }
            private string _cPhone;
    
            public string CPhone
            {
                get { return _cPhone; }
                set { _cPhone = value; }
            }
    
        }
    

      WEB.Configer的配置文件:

    <?xml version="1.0" encoding="utf-8"?>
    
    <!--
      有关如何配置 ASP.NET 应用程序的详细消息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    
    <configuration>
      <connectionStrings>
       <add name="connstr" connectionString="server=.;database=test;uid=sa;pwd=123456" providerName="SQLServer"/>
       <!-- <add name="connstr" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db1.mdb" providerName="Access"/>-->
    
    
      </connectionStrings>
        <system.web>
            <compilation debug="true" targetFramework="4.0" />
        </system.web>
    
    </configuration>
    

      

      最后在WEB项目里建一个DEMO.ASPX做一下测试,代码如下:

      

    View Code
     1         protected void Button1_Click(object sender, EventArgs e)
     2         {
     3             DAL.CustomerDAL cd = new DAL.CustomerDAL();
     4 
     5             Customer customer = new Customer();
     6             customer.CName = "ccx";
     7             customer.CPhone = "878787";
     8             
     9             cd.Insert(customer);
    10             Response.Write("ok");
    11         }
    12 
    13         protected void Button2_Click(object sender, EventArgs e)
    14         {
    15             DAL.CustomerDAL cd = new DAL.CustomerDAL();
    16             Customer customer = new Customer();
    17             customer = cd.Get(1);
    18             Response.Write(customer.CName);
    19         }
  • 相关阅读:
    常用 SQL Server 规范集锦
    让Git忽略所有obj和bin目录的同步
    Sql server 存储过程基础语法
    nginx 站点代理,负载均衡
    CentOS7.0安装Nginx-1.12.0
    CentOS7安装GNOME可视化界面和如何配置IP地址
    开发工具资料集合
    NOIP2018总结反思
    NOIP2018考试报告
    STL基础用法
  • 原文地址:https://www.cnblogs.com/cxeye/p/2652311.html
Copyright © 2011-2022 走看看