2009-08-13 11 views
3

Ich versuche, eine Sammlung aus einem IDataReader, der von einer anderen Methode zurückgegeben wurde, zu füllen ... aus irgendeinem Grund wirft es weiterhin einen "No parameterless Konstruktor für dieses Objekt definiert." Fehler für diese Linie:CBO.FillCollection wirft "Kein parameterloser Konstruktor für dieses Objekt definiert." Fehler

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

ich die Parameter Aussondern versucht haben, so Dinge separat initialisiert, bis ich dies hatte:

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

und ich war immer noch einen Fehler immer auf der gleichen Linie.

Irgendwelche Ideen?

Antwort

5

Der Hinweis ist in der Nachricht. Es gibt keinen parameterlosen Konstruktor für System.String, daher kann er nicht mit Activator.CreateInstance erstellt werden. Dies wird normalerweise zum dynamischen Erstellen von Objekten verwendet.

EDIT: Eine Lösung wäre es, die Leser direkt zu verwenden:

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

Also was muss ich tun ...? – Matt

+0

Haben Sie eine mögliche Lösung hinzugefügt - hth –

+0

Awesome, danke! – Matt

1

CBO.FillCollection scheint ein Problem mit Werttypen zu haben.

Die bessere Antwort ist bereits gebucht (Zugriff der Leser direkt), sondern zu verstehen, was die FillCollection Methode sucht, können Sie Ihr Problem damit gelöst haben könnten:

eine neue Klasse mit einer Eigenschaft hinzufügen auf Ihr SQL-Spaltenname:

class StringRow { public string Name; } 

es verwenden, um FillCollection zu passieren, wie:

List<string> stringCollection = new List<string>(); 
foreach (StringRow row in CBO.FillCollection<StringRow>(DataProvider...)) 
{ 
    stringCollection.Add(row.Name); 
} 

es will ein Objekt mit einer benannten Eigenschaft es refle kann festgelegt. Selbst wenn Sie eine Liste von int abgerufen haben, hat das int-Objekt keine 'Name'-Eigenschaft (aus der Spalte in der SQL-Rückgabesatzgruppe gezogen), die in diesem Fall eine Liste von 0s zurückgibt.

Leider int? und das Setzen der SQL-Return-Spalte auf [Wert] behebt die Lösung nicht.

Verwandte Themen