3

別のメソッドによって返されたIDataReaderからコレクションを埋めようとしています...何らかの理由で、「このオブジェクトにパラメーターのないコンストラクターが定義されていません」とスローされ続けます。この行のエラー:

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

私はこれを手に入れるまで物事が別々に初期化されるようにパラメータを分離しようとしました:

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

同じ行でまだエラーが発生していました。

何か案は?

4

2 に答える 2

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);
}
于 2009-08-13T16:23:40.490 に答える
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);
}

反射的に設定できる名前付きプロパティを持つオブジェクトが必要です。したがって、のリストを取得している場合でもintintオブジェクトには設定する'Name'プロパティ(SQLリターンセットの列から取得)がありません。この場合、オブジェクトは0のリストを返します。

残念ながら、int?SQLの戻り列を使用して[値]に設定しても、解決策は改善されません。

于 2010-08-18T07:22:57.813 に答える