昨晚有去想一下,實現數據庫切換的其他方法。這個方法不是我想到,以前看過別人這么做過。然后回憶回憶着就寫出來了。
好了,說一下他實現的方法。當然他有一個比較大的缺點在后面說一下。在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 }
