读书人

使用 DbProviderFactory 访问数据库的

发布时间: 2013-09-26 10:32:35 作者: rapoo

使用 DbProviderFactory 访问数据库的问题
ADO.net中有SqlXXX,OledbXXX,OdbcXXX来操作数据库,但当数据库改变时却要修改所有相关代码,很不方便,于是就想到用工厂类来操作,但是当用:

DbProviderFactory factory= DbProviderFactories.GetFactory(providerString);


若 providerString是“System.Data.SqlClient”时,它和直接使用 SqlXXXX 去操作数据库有无效率上的差别呢?(问此是因为人们都说 SqlXXXX 是专为 MsSql 数据库操作设计的),O(∩_∩)O谢谢
[解决办法]
说了半天,原来你的意思是通过一个函数获取SqlConnection和直接调用构造函数得到SqlConnection的区别啊。那没有区别。我还以为你有什么SqlConnection的替代品呢。
[解决办法]
在dbhelper中最好不要暴露DBDataReader。因为SQL Server的provider就无法保证这个对象在多线程时独立地正常使用(你必须时刻警惕着关闭SqlConnection)。

在DbHelper中你可以直接得到强类型的对象集合,例如对于实体类型

public class MyObj
{
public string Name;
public double Value;
}

然后在查询中就可以写类似这样的代码(我没有测试,可能有语法错误,看懂就好):

List<MyObj> result;
using (var conn = db.DbConnection())
{
conn.Open();
var comm = conn.CreateCommand();
comm.CommandText = 从配置的资源文件中获取查询MyObj的语句;
comm.CommandType = System.Data.CommandType.Text;
result = ( from DbDataRecord record in comm.ExecuteReader()
let name = (string)record["TheName"]
select new MyObj{


Name = name,
Value = (double)record["Number"]
};
).ToList();
}


这样,直接返回强类型的数据实体集合对象,而不是返回 DbDataReader。


另外你的SqlHepler中缺乏一个重要的机制,就是如何获取sql语句。当你换不同的关系数据库Provider的时候,你的sql语句也需要动态切换。那么你就无法在代码中直接实现 string sql这样的参数,而应该是一个key,根据这个key以及providerString两个参数,再来查询得到不同关系数据库中的sql语句。

读书人网 >asp.net

热点推荐