2017-10-12 9 views
2
List<T> returnList = new List<T>(); 
conn.Open(); 
SqlCommand sCmd = new SqlCommand(query, conn); 
SqlDataReader dataReader = sCmd.ExecuteReader(); 
T t = new T(); 
PropertyInfo[] p = o.GetType().GetProperties(); 
while(dataReader.Read()) 
{ 
    for (int i = 0; i < p.Length; i++) 
    { 
     Console.WriteLine(p[i].GetValue(t)+" "+p[i].PropertyType+" 
     "+dataReader[i].GetType()); 
     p[i].SetValue(dataReader[i], t); 
    } 
    returnList.Add(t); 
} 
return returnList; 

実行時にsqldatareaderオブジェクトから特定のプロパティの値を設定します。 しかし、両方の参照が同じタイプであっても、ターゲットタイプの不一致を例外にしていますsqldatareader型から対象の型にプロパティ値を設定できません

+0

この例外をどのラインで受け取りますか?データウェアハウスの列があなたのプロパティと同じ順序であることをどのように知っていますか? –

+1

私が値を設定している行と、テーブルに列が置かれている順序をクラスに書き込んだ –

+0

メソッドのシグネチャをコードに追加できますか? (公的/私的リスト myMethodName ...) –

答えて

1

ここでは2つの問題があります。主なものは、SetValue()に間違った電話をかけたことです。

MSDNから:

公共ボイドのSetValue(オブジェクトobj、オブジェクト値)

だから、実際にあなたが間違って置かれた引数を持つメソッドを呼び出しています。これを行うと、それは問題ないはずです:あなたが遭遇する

p[i].SetValue(t, dataReader[i]); 

第二の問題は、あなたが一度だけ(T t = new T();新しいオブジェクトを作成しますので、最後に、あなたのリストには、唯一の同じオブジェクトが含まれているということです、それを解決するために。 、あなたはwhileループ内でこの行を配置する必要があります。

また、use usingクリーンなコードのために、あなたが...最後に、あなたのコマンドを配置し、接続を閉じる必要がありますので。

をすべてのすべてで、これは、最終コード:

List<T> returnList = new List<T>(); 
conn.Open(); 
using (SqlCommand sCmd = new SqlCommand(query, conn)) 
{ 
    SqlDataReader dataReader = sCmd.ExecuteReader(); 
    PropertyInfo[] p = o.GetType().GetProperties(); 
    while(dataReader.Read()) 
    { 
     T t = new T(); 
     for (int i = 0; i < p.Length; i++) 
     { 
      Console.WriteLine(p[i].GetValue(t)+" "+p[i].PropertyType+" "+dataReader[i].GetType()); 
      p[i].SetValue(t, dataReader[i]); 
     } 
     returnList.Add(t); 
    } 
} 
conn.Close(); 
return returnList; 
+1

ありがとうございました –

+2

@SohelAhmedこれがあなたの質問に答えるなら、それを答え(答えの上部のチェックマーク)としてマークしてください。そうすれば、他の人はこの質問に答えることができます。 –

関連する問題