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         }

 

posted @ 2012-08-23 13:17  春天又来了  阅读(4429)  评论(28编辑  收藏  举报