c# - 从DataReader检索数据的最有效方法是什么?

标签 c# performance sqldatareader data-access

我花费大量时间查询数据库,然后从查询中构建对象的集合。为了提高性能,我倾向于使用Datareader,并且代码类似于:

while(rdr.Read()){
    var myObj = new myObj();

    myObj.Id = Int32.Parse(rdr["Id"].ToString();

    //more populating of myObj from rdr

    myObj.Created = (DateTime)rdr["Created"];
}


对于像DateTime这样的对象,我只是将rdr值转换为所需的类,但是对于int这样的值类型无法做到这一点,因此(IMHO)费力的ToString()后跟Int.Parse(...)

当然,还有另一种选择:

myObj.Id = rdr.GetInt32(rdr.GetOrdinal("Id"));


看起来更干净,并且不涉及对ToString()的调用。

我和一位同事今天正在讨论这个问题-他建议在上述代码中两次访问rdr可能不如我以前的惯用方式那样有效-任何人都可以确认或否认这并建议上面哪个是best做这种事情的方式?我特别欢迎@JonSkeet的回答;-)

最佳答案

我怀疑会有非常明显的性能差异,但是您可以通过将其从循环中移出而避免在每行进行名称查找。这可能是您将能够达到的最佳效果:

int idIdx = rdr.GetOrdinal("Id");
int createdIdx = rdr.GetOrdinal("Created");

while(rdr.Read())
{
    var myObj = new myObj();

    myObj.Id = rdr.GetFieldValue<int>(idIdx);

    //more populating of myObj from rdr

    myObj.Created = rdr.GetFieldValue<DateTime>(createdIdx);
}

关于c# - 从DataReader检索数据的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21136805/

相关文章:

c# - 没有服务器的Unity3D内置多人游戏?

database - 如何在 SQL Server 2008 中优化存储以下 SQL 数据

c# - CommandBehavior.SequentialAccess 是否有任何性能提升?

c# - SqlDataReader 获取特定的 ResultSet

c# - 努力.Exceptions.EffortException : Database has not been initialized - after non commited update?

c# - Elasticsearch.NET 版本 7 - 如何创建索引

c++ - 虚函数性能: one large class vs many smaller subclasses

c# - ado.net中单连接执行reader和执行非查询

c# - 使用 WPF/C# 获取有关处理器的信息

php - 一个文件夹中有 100 万个或更多文件,用于包含(缓存)