我正处于一个项目的中间,我们正在查询一个拥有超过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;
}
答案 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”的字符串可能会降低它的速度。