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的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | 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的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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的配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具