问一个DbProviderFactory的问题
请问
使用
DbProviderFactory dbfactory = DbProviderFactories.GetFactory( "System.Data.SqlClent ");
DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
跟使用
DbDataAdapter dbDataAdapter = new SqlDataAdapter();
这两者有什么区别吗?
为什么还要多一个 DbProviderFactory 工厂
我直接指定一个枚举
public enum DbType
{
SqlServer,
Oledb,
Oracle,
Odbc
}
然后写方法
public static DbDataAdapter GetDataAdapter(DbType dbType)
{
DbDataAdapter Ada;
switch (dbType)
{
case DbType.SqlServer:
Ada = new SqlDataAdapter();
break;
case DbType.Oracle:
Ada = new OracleDataAdapter();
break;
case DbType.Oledb:
default:
Ada = new OleDbDataAdapter();
break;
case DbType.Odbc:
Ada = new OdbcDataAdapter();
break;
}
return Ada;
}
然后这么做
DbDataAdapter dbDataAdapter = GetDataAdapter(DbType.SqlServer)
这样不是也能完成
DbProviderFactory的功能吗?
[解决办法]
当你有新的Database类加入的时候,不用再重新修改你的枚举,重新编译.
DbProviderFactory dbfactory = DbProviderFactories.GetFactory( "System.Data.SqlClent ");是通过类型名称反射生成连接类型.可以支持以后的数据库类型扩展
[解决办法]
1,修改枚举并不影响以后数据库的添加和已有代码的兼容
=========================================================
你需要重新发布,如果客户想在你的产品上进行二次开发,不能使用你的接口,做不到他的要求
2,反射在性能上有一定损失
============================================================
这是一种权衡,损失1秒钟,但是对你扩展性,维护性带来的收益会远远大于这1秒
3,在一些地方使用DbProviderFactory 好像无法实现
=================================================================
DbProviderFactory 是抽象类,里面的方法需要你去重写
另外,我建议你看看设计模式,可能就理解他的作用了.