3

我试图从另一个方法返回的 IDataReader 中填充一个集合......由于某种原因,它不断抛出“没有为此对象定义的无参数构造函数”。此行的错误:

List<string> names = CBO.FillCollection<string>(DataProvider.Instance().ExecuteReader("getNames", new SqlParameter("UserId", 1)));

我已经尝试分离出参数,以便单独初始化,直到我有了这个:

List<string> names = CBO.FillCollection<string>(nameDataReader);

我仍然在同一行出现错误。

有任何想法吗?

4

2 回答 2

5

线索在消息中。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);
}
于 2009-08-13T16:23:40.490 回答
1

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] 并不能解决问题。

于 2010-08-18T07:22:57.813 回答