上午看到一个兄弟的文章很辛苦的想实现不改代码只改配置来访问不同类型的数据库自己去实现工厂模式精神可嘉但是殊不知c#已经自己为不同类型数据库的访问做了一个工厂在这里我就把使用工厂的例子贴出来供不知道的兄弟参考一下高手们可以忽略了
首先是配置文件其中的providerName就是指定的不同数据库类型
<connectionStrings>
<add name= connectionString= providerName=SystemDataOleDb />
<add name= connectionString= providerName=SystemDataSqlClient />
</connectionStrings>
下面看一下使用工厂的这个类
class DataBaseFac
{
private DbConnection cnn;//抽象类型
private DbCommand cmd;//抽象类型
private DbProviderFactory provider;
public DataBaseFac()
{
//从配置文件中取出标示数据库类型的字符串
string providerName = ConfigurationManagerConnectionStrings[]ProviderName;
//根据上一部的结果工厂创建一个对应的实例
provider = DbProviderFactoriesGetFactory(providerName);
//使用该实例就可以创建对应的connectioncommand和adapater对象了
//调试的时候可以看到这几个对象都变成了相应于数据库类型的
cnn = providerCreateConnection();
cnnConnectionString = ConfigurationManagerConnectionStrings[]ConnectionString;
cmd = providerCreateCommand();
cmdConnection = cnn;
}
//执行一次查询返回数据表
public DataTable ExcuteQuery(string queryString)
{
DataTable result = new DataTable();
DbDataAdapter adapter = providerCreateDataAdapter();
cmdCommandType = CommandTypeText;
cmdCommandText = queryString;
adapterSelectCommand = cmd;
try
{
cnnOpen();
adapterFill(result);
}
catch
{
result = null;
}
finally
{
cnnClose();
}
return result;
}
以上只是简单的应用并没有做比较高级的封装只供不知道的兄弟参考
顺便说说上午看到那个兄弟的文章用swith case语句来实现不同的创建connection command 和adapater的方法然后说是工厂方法的实现其实这是完全错误的工厂模式的提出就是为了避免这么多swith case造成的麻烦以后有时间我会把几个常用的模式的提出原因和应用场合总结一下用C#做几个例子给不清楚的兄弟贴出来的