控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

C#学习- 通过基于接口的编程来实现数据库的切换

作者:未知 出处:cnblogs 2012年08月23日 阅读:

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

 
  好了,说一下他实现的方法。当然他有一个比较大的缺点在后面说一下。在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做一下测试,代码如下:
 
 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         }

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统