Генерация CBO.FillCollection Для этого объекта не определен конструктор без параметров. ошибка

Я пытаюсь заполнить коллекцию из IDataReader, которая была возвращена другим методом... по какой-то причине он продолжает выдавать "Для этого объекта не определен конструктор без параметров". ошибка для этой строки:

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

Я пытался разделить параметры, чтобы все инициализировалось отдельно, пока у меня не было этого:

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

и я все еще получал ошибку в той же строке.

Любые идеи?


person Matt    schedule 13.08.2009    source источник


Ответы (2)


Подсказка в сообщении. Для 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);
}
person kͩeͣmͮpͥ ͩ    schedule 13.08.2009
comment
Добавил возможное решение - hth - person kͩeͣmͮpͥ ͩ; 13.08.2009

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] не исправляют решение.

person Spencer Creasey    schedule 18.08.2010