首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

使用 DbProviderFactory 访问数据库的有关问题

2013-09-26 
使用 DbProviderFactory 访问数据库的问题ADO.net中有SqlXXX,OledbXXX,OdbcXXX来操作数据库,但当数据库改

使用 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语句。

热点排行