2009-08-13 59 views
3

我想從另一個方法返回的IDataReader中填充一個集合...由於某種原因,它一直拋出一個「沒有爲此對象定義的無參數構造函數」。錯誤這條線:CBO.FillCollection拋出「沒有爲此對象定義的無參數構造函數」。錯誤

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

我試着分離出的參數,直到我有這個事情被分開初始化:

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

,我仍然在同一行收到一個錯誤。

任何想法?

回答

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); 
} 
+0

那麼我該怎麼做......? – Matt 2009-08-13 16:30:29

+0

已添加可能的解決方案 - hth – 2009-08-13 16:35:16

+0

真棒,謝謝! – Matt 2009-08-13 16:48:20

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); 
} 

它要使用指定屬性可以refle對象積極設置。因此,即使您檢索int的列表,int對象也沒有'Name'屬性(從SQL返回集中的列中拉出)進行設置,在這種情況下,它將返回一個0列表。

不幸的是,使用int?並將SQL返回列設置爲[Value]不能解決此問題。

相關問題