繁体   English   中英

CBO.FillCollection抛出“没有为此对象定义的无参数构造函数。”错误

[英]CBO.FillCollection throwing “No parameterless constructor defined for this object.” error

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

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

我已经尝试分离出参数,所以事情会分开初始化,直到我有了这个:

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

我在同一条线上仍然收到错误。

有任何想法吗?

消息中的线索。 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);
}

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对象也没有“Name”属性(从SQL返回集中的列中拉出)来设置,在这种情况下,它将返回0的列表。

不幸的是,使用int? 并将SQL返回列设置为[Value]并不能解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM