下面用工厂模型来实现一个连接数据库的例子。实现在不改变代码的前提下,只通过修改相应的配置文件,就可以达到连接SQL Server和Access的目的。
在现实情况中,我们经常遇到同一个程序,在不同的地方要连接不同数据库的问题。为此,我们传统做法是把所有的代码都写在程序中,用if else做判断,然后再选择要连接的数据库。
下面的程序使用工厂模型的概念,利用接口来实现在不改变代码的前提下,只需改动相应的配置文件,就可以达到切换数据库的目的。而且在连接未知数据库时,也不需要改原代码,只需要扩展接口实现类.
说明:示例共有五个文件。
ISQLHelper.cs是定义数据访问接口文件。里面定义了两个数据访问方法:GetData()和SetData()
[c-sharp] view plain copy using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TJVictor.DesignPattern.FactoryPattern { public interface ISQLHelper { string GetData(); void SetData(string data); } }
SQLSever.cs继承ISQLHelper接口,实现接口方法
[c-sharp] view plain copy using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TJVictor.DesignPattern.FactoryPattern { public class SQLServer:ISQLHelper { private string _data; private SQLServer() { _data = "SQLServer"; } public static ISQLHelper GetInstance() { return new SQLServer() as ISQLHelper; } #region ISQLHelper Members public string GetData() { return _data; } public void SetData(string data) { _data = data; } #endregion } }
Access.cs继承ISQLHelper接口,实现接口方法
[c-sharp] view plain copy using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TJVictor.DesignPattern.FactoryPattern { public class Accesss:ISQLHelper { private string _data; private Accesss() { _data = "Accesss"; } public static ISQLHelper GetInstance() { return new Accesss() as ISQLHelper; } #region ISQLHelper Members public string GetData() { return _data; } public void SetData(string data) { _data = data; } #endregion } }
SQLFactory.cs是工厂类,根据配置文件动态创建SQLServer或是Access
[c-sharp] view plain copy using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; namespace TJVictor.DesignPattern.FactoryPattern { public class SQLFactory { public static ISQLHelper GetInstance() { string appString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString; string type = appString.Split(':')[0]; string conStr = appString.Split(':')[1]; //根据配置文件中的设置,返回对应的数据库实例 switch (type) { case "SQLServer": return SQLServer.GetInstance(); case "Access": return Accesss.GetInstance(); default: break; } return null; } } }
App.config是配置文件,定义本地程序需要用哪种数据库连接
[c-sharp] view plain copy <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="ConStr" connectionString="SQLServer:server=tjvictor/sqlserver2008;Integrated Security = true;database=TestDB;MultipleActiveResultSets=true;"/> <!--<add name="ConStr" connectionString="Access:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/mydatabase.mdb;User Id=admin;Password=;"/>--> </connectionStrings> </configuration>
调用代码
[c-sharp] view plain copy ISQLHelper sqlHelper = SQLFactory.GetInstance(); Show(sqlHelper.GetData()); sqlHelper.SetData("dddd"); Show(sqlHelper.GetData());
大家已经注意到了,调用代码里面都是面向接口编程的,所以只要接口稳定,那么程序的升级或是改动也就是稳定的。
情况一,修改Access的某个访问方法:只需要改Access里面的代码,不需要改主程序的任何地方。
情况二,增加对MySQL的支持:只需要增加一个MySql.cs,继承ISQLHelper,Factory里面增加对MySQL的判断即可。主程序不需要改任何地方,只需要把配置文件改成MySQL的连接字符串即可。
上面的程序只是示例程序,里面的GetData()和SetData()没有意义,下面我给出在一般情况下访问数据库时,需要的接口方法,大家可以按照上面的代码说明,去实现自己的SQLHelper类。
[c-sharp] view plain copy using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Xml; namespace TJVictor.DataBase.SqlHelper { public interface ISQLHelper { int ExecuteNonQuery(string executeSql); IDataReader ExecuteReader(string executeSql); T ExecuteScalar<T>(string executeSql); DataSet ExecuteDataSet(string executeSql); DataTable ExecuteTable(string executeSql); XmlReader ExecuteXmlReader(string executeSql); } }
如需转载,请注明本文原创自 TJVictor专栏:http://blog.csdn.net/tjvictor