有没有办法将 DataReader 中的数据直接存储到 List<class>
Is there a way to store data from a DataReader directly into a List<class>
我正在从 SqlCommand
创建数据reader,我目前将此信息存储在 class 中,其中包含以下内容
private object PopulateObjectWithFields(SqlDataReader read, Type className)
{
var gd = Activator.CreateInstance(className);
for (int i = 0; i < read.FieldCount; i++)
{
var type = gd.GetType();
var fi = type.GetField(read.GetName(i));
if (fi != null)
{
if (!Convert.IsDBNull(read[i]))
{
try
{
fi.SetValue(gd, read[i]);
}
catch
{
throw new Exception(string.Format("Unable to set {0}. Class type {1}. DB Type {2}", read.GetName(i), fi.FieldType.Name, read[i].GetType().Name));
}
}
}
else
{
var pi = type.GetProperty(read.GetName(i));
if (pi != null)
{
if (!Convert.IsDBNull(read[i]))
{
try
{
pi.SetValue(gd, read[i]);
}
catch
{
throw new Exception(string.Format("Unable to set {0}. Class type {1}. DB Type {2}", read.GetName(i), fi.FieldType.Name, read[i].GetType().Name));
}
}
}
}
}
return gd;
}
这非常有效。我现在想要的是将它放在 List<class>
、 中,但我似乎无法正确地动态创建 List<class>
。
有人可以帮我解决语法问题吗?
var MyList = List<MyClass> //This should be dynamically created
using(var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MyList.Add(PopulateObjectWithFields(read, MyClass));
}
}
让我澄清一下
我不知道 reader 中会有哪些列,也不知道 class 会传入什么。我有一个通用方法需要填充任何 reader 到任何 class,只要列名与 class
中字段的 属性 相匹配
你应该使用泛型:
private T PopulateObjectWithFields<T>(SqlDataReader read) where T : new()
您的方法的实现保持不变,只是您使用 T
而不是 MyClass
,并且您可以使用构造函数直接实例化类型:
var gd = new T();
从那里,您可以轻松地将对象存储在列表中:
var MyList = List<MyClass> //This should be dynamically created
using(var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MyList.Add(PopulateObjectWithFields<MyClass>(read);
}
}
我正在从 SqlCommand
创建数据reader,我目前将此信息存储在 class 中,其中包含以下内容
private object PopulateObjectWithFields(SqlDataReader read, Type className)
{
var gd = Activator.CreateInstance(className);
for (int i = 0; i < read.FieldCount; i++)
{
var type = gd.GetType();
var fi = type.GetField(read.GetName(i));
if (fi != null)
{
if (!Convert.IsDBNull(read[i]))
{
try
{
fi.SetValue(gd, read[i]);
}
catch
{
throw new Exception(string.Format("Unable to set {0}. Class type {1}. DB Type {2}", read.GetName(i), fi.FieldType.Name, read[i].GetType().Name));
}
}
}
else
{
var pi = type.GetProperty(read.GetName(i));
if (pi != null)
{
if (!Convert.IsDBNull(read[i]))
{
try
{
pi.SetValue(gd, read[i]);
}
catch
{
throw new Exception(string.Format("Unable to set {0}. Class type {1}. DB Type {2}", read.GetName(i), fi.FieldType.Name, read[i].GetType().Name));
}
}
}
}
}
return gd;
}
这非常有效。我现在想要的是将它放在 List<class>
、 中,但我似乎无法正确地动态创建 List<class>
。
有人可以帮我解决语法问题吗?
var MyList = List<MyClass> //This should be dynamically created
using(var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MyList.Add(PopulateObjectWithFields(read, MyClass));
}
}
让我澄清一下 我不知道 reader 中会有哪些列,也不知道 class 会传入什么。我有一个通用方法需要填充任何 reader 到任何 class,只要列名与 class
中字段的 属性 相匹配你应该使用泛型:
private T PopulateObjectWithFields<T>(SqlDataReader read) where T : new()
您的方法的实现保持不变,只是您使用 T
而不是 MyClass
,并且您可以使用构造函数直接实例化类型:
var gd = new T();
从那里,您可以轻松地将对象存储在列表中:
var MyList = List<MyClass> //This should be dynamically created
using(var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
MyList.Add(PopulateObjectWithFields<MyClass>(read);
}
}