DataReader在将记录映射到对象时挂起

时间:2009-07-02 19:26:23

标签: .net ado.net

我正处于一个项目的中间,我们正在查询一个拥有超过2000万条记录的数据库,应用了几组过滤器,我们的查询返回了大约200条记录(在等待大约1.30分钟后)。在查询数据库之后,我尝试从这个特定的datareader创建对象,但是每隔15或16条记录就会挂起一次asp.net进程(它挂在调试器中),所以我认为这是一个DataReader问题。

这让我发疯了。

这是我正在使用的代码

using (IDataReader reader = cmd.ExecuteReader())
                {
List<Project> projects = new List<Project>();
                    while(reader.Read()) projects.Add(GetMappedRecord(reader)); 
                }

private Project GetMappedRecord(DataRow reader)
        {
            Project project = new Project();

            project.PropertyA = reader["FieldA"] as string;

// and so on and so forth...
            return project;
        }

2 个答案:

答案 0 :(得分:0)

“DataReader问题”?

如果您想要编写一段代码,其行为与您认为DataReader的行为方式相同,那么您可以这样做吗?有时候想一想,“如果我是一个虫子,我会藏在哪里”,或“我哪里不能藏起来?”

可能还有更多。

实验1:

using (IDataReader reader = cmd.ExecuteReader())
{
    while(reader.Read())
        ; 
}

看看是否挂起。请参阅 时挂起(过滤器集合)。

当您获得挂起(以及一组过滤器)时,请在Management Studio中尝试相同的SQL(具有相同的参数)。查看该组合是否需要很长时间(如果您使用的是SQL Server 2008,请查看活动监视器以查看您的查询是否在“慢”列表中)。


由于实验1成功,但是索引器存在问题,让我们尝试以下方法:

try {
    using (IDataReader reader = cmd.ExecuteReader())
    {
        while(reader.Read()) {
            for (int i=0; i<reader.FieldCount; i++) {
                object v = reader.GetValue(i);
            }
        } 
    }
} catch (Exception ex) {
    Console.WriteLine(ex.ToString()); // Or MessageBox.Show or whatever
}

让我们看看是否挂起(以及持续多长时间!)

答案 1 :(得分:0)

也许它与演员有关?我习惯使用DataReader的方式更像是这样:

while(reader.Read())
{
    var Project = new Project();
    Project.StringProperty = reader.IsDBNull(reader.GetOrdinal("FieldA"))
                           ? ""
                           : reader.GetString(reader.GetOrdinal("FieldA"));
    //etc....
}

可能隐式转换为DataRow,然后再次从reader [“FieldA”]转换为带有“as”的字符串可能会降低它的速度。