我必须从数据库中读取100.000行,我使用此代码:
List<elementClass> Listelement = new List<elementClass>();
using (DbDataReader reader = cmd.ExecuteReader())
{
while (reader .Read())
{
elementClass element= new elementClass();
DatabaseClass.ReadFromObject(reader , element);
Listelement.Add(element);
}
}
ReadFromObject:
public static void ReadFromObject(DbDataReader dr, Object obj)
{
DataTable tableDescriptor = dr.GetSchemaTable();
try
{
//Id - Identifier
obj.GetType().GetProperty("Id").SetValue(obj, dr.GetValue(dr.GetOrdinal("Id")), null);
PropertyInfo[] properties = obj.GetType().GetProperties();
foreach (PropertyInfo pi in properties)
{
if (!ExistColumn(tableDescriptor, pi.Name)) continue; // field not found
if (dr[pi.Name] == DBNull.Value) continue;
if (pi.PropertyType.IsEnum) { }
else
{
switch (pi.PropertyType.Name)
{
case "DateTime":
object dateValue = null;
if (dr[pi.Name].GetType().Name == "String")
dateValue = F24Common.Utility.DateFromString(dr.GetString(dr.GetOrdinal(pi.Name)));
else
dateValue = dr.GetDateTime(dr.GetOrdinal(pi.Name));
pi.SetValue(obj, dateValue, null);
break;
default:
pi.SetValue(obj, dr.GetValue(dr.GetOrdinal(pi.Name)), null);
break;
}
}
}
}
catch (Exception )
{
}
}
这段代码肯定有问题,它太慢了(整个处理需要45-50分钟)。 是否可以同时使用多个CPU内核(我有一个四核CPU)来填充列表?
答案 0 :(得分:1)
乍一看,我认为瓶颈在于反射量。我建议你好好阅读Jon Skeets Making Reflection fly article。然后,您可以缓存键入obj
类型的相应代理。
我会犹豫从多个线程访问DataReader,因为我怀疑这样做是安全的。