我正在尝试填充另一个方法返回的IDataReader中的集合...由于某些原因,它一直抛出“没有为这个对象定义无参数构造函数”。此行错误:
List<string> names = CBO.FillCollection<string>(DataProvider.Instance().ExecuteReader("getNames", new SqlParameter("UserId", 1)));我试着分离出参数,这样事情就会被单独初始化,直到我有了这个:
List<string> names = CBO.FillCollection<string>(nameDataReader);我仍然在同一行上得到一个错误。
有什么想法吗?
发布于 2009-08-13 16:23:40
线索就在消息里。System.String没有无参数的构造函数,因此不能使用Activator.CreateInstance创建它,后者通常用于动态创建对象。
编辑:一种解决方案是直接使用阅读器:
var strings = new List<string>();
using(var reader = DataProvider.Instance().ExecuteReader("getNames", new SqlParameter("UserId", 1)))
{
while(reader.Read())
strings.Add(reader[0] as string);
}发布于 2010-08-18 15:22:58
CBO.FillCollection似乎在值类型方面有问题。
更好的答案已经发布(直接访问阅读器),但是要理解FillCollection方法寻找的是什么,您可以使用以下命令解决您的问题:
添加一个属性设置为SQL列名的新类:
class StringRow { public string Name; } 使用它传递给FillCollection,如下所示:
List<string> stringCollection = new List<string>();
foreach (StringRow row in CBO.FillCollection<StringRow>(DataProvider...))
{
stringCollection.Add(row.Name);
}它想要一个具有可反射设置的命名属性的对象。因此,即使您检索的是一个名称列表,int对象也没有要设置的‘int’属性(从SQL返回集中的列中提取),在这种情况下,它将返回一个0的列表。
不幸的是,使用int?并将SQL返回列设置为Value并不能解决问题。
https://stackoverflow.com/questions/1272931
复制相似问题