2009-08-13 12 views
3

J'essaie de remplir une collection à partir d'un IDataReader qui a été retourné par une autre méthode ... pour une raison quelconque, il continue à lancer un "Constructeur non paramétrable défini pour cet objet". erreur pour cette ligne:Lancer CBO.FillCollection "Aucun constructeur sans paramètre défini pour cet objet." erreur

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

J'ai essayé de séparer les paramètres tant de choses initialisées séparément jusqu'à ce que je présente:

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

et je continuais à faire une erreur sur la même ligne.

Des idées?

Répondre

5

L'indice est dans le message. Il n'y a pas de constructeur sans paramètre pour System.String, donc il ne peut pas être créé en utilisant Activator.CreateInstance, qui est habituellement utilisé pour créer dynamiquement des objets.

EDIT: Une solution serait d'utiliser le lecteur directement:

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

Alors qu'est-ce que je dois faire ...? – Matt

+0

Ont ajouté une solution possible - hth –

+0

Génial, merci! – Matt

1

CBO.FillCollection semble avoir un problème avec les types de valeur.

La meilleure réponse est déjà affichée (accéder directement au lecteur), mais de comprendre ce que la méthode FillCollection recherche, vous auriez pu résoudre votre problème avec ceci:

Ajouter une nouvelle classe avec une propriété définie sur votre nom de colonne SQL:

class StringRow { public string Name; } 

l'utiliser pour passer à FillCollection, comme:

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

il veut un objet avec une propriété nommée peut Refle réglé de manière Ainsi, même si vous récupérez une liste de int, l'objet int n'a pas de propriété 'Name' (extraite de la colonne dans l'ensemble de retour SQL) à définir, auquel cas il renvoie une liste de 0.

Malheureusement, l'utilisation de int? et la définition de la colonne de retour SQL sur [Valeur] ne remédie pas à la solution.