2017-07-13 11 views
0

列IDに基づいてSqlDataReaderからいくつかの種類のフィールドを読んでいます。私はListのフィールドを取得する汎用関数を記述しようとしました。SqlDataReaderの汎用リストを入力してください

private static List<T> GetSqlFields<T>(SqlDataReader reader, int columnId) 
    { 
     var fields = new List<T>(); 
     while (reader.Read()) 
     { 
      T f = reader.Get... // Problem is here 
      fields.Add(f); 
     } 
     return fields; 
    } 

問題は、私が唯一の方法GetStringを、見ているGetInt32、など。Tに基づいてフィールドを取得する方法はありますか?ありがとうございました。

私は書くことができるようにするためにこれをやっている:

int fooColumnId = reader.GetOrdinal("Foo"); 
    int barColumnId = reader.GetOrdinal("Baar"); 
    List<string> foos = GetSqlFields<string>(reader, fooColumnId); 
    List<int> baars = GetSqlFields<int>(reader, barColumnId); 
+0

int fooColumnId =(int)reader ["Foo"]; \t \t int barColumnId =(int)reader ["Bar"]; – CodeConstruct

+1

'.GetValue()'に変換し、 'Convert'を通してそれをパイプすることができます(あるいは、ユーザが決してミスをしないと思うなら' T'にハードキャストしてください)。それを越えて、あなたがボクシングを避けたいならば、あなたは 'Type.GetTypeCode(typeof(T))'に大胆な 'switch'を必要とします。または、より良いことに、ホイールを再開発せず、Dapper(または別のマイクロORM)を使用して、内部ループを最適化しています。 –

+0

@ JeroenMostert:ジェネリックな 'GetFieldValue'がありますので、大きなお尻スイッチ(https://xkcd.com/37/)や' Convert'やサードパーティのツールを使う必要はありません。 – Chris

答えて

2

あなたがお勧めします:SqlDataReader.GetFieldValue<T>(int i)

この方法は、(リンクドキュメントが示すように)列番号のためにint型をとり、注目すべきは、T型のオブジェクトを返します。これはその上任意のTが、それがサポートするリストを(サポートしていないということですページ)は、対象となる可能性のあるものをカバーしています(つまり、SQLデータ型の.NETに相当するすべての型のように見えます)。

興味のある列の索引を持っていない場合(この場合はそうですが、完全性を追加しています)、GetOrdinal(String)を使用して列名から列番号を取得できます。

+1

ありがとう、私はこれを逃した。 – bencemeszaros

1

はあなたが後にしているものを知っているが、しないでください。

private static List<T> GetSqlFields<T>(SqlDataReader reader, int columnId, 
    Func<IDataReader, int, T> accessor) 
{ 
    var fields = new List<T>(); 
    while (reader.Read()) 
    {    
     T f = accessor(reader, columnId); 
     fields.Add(f); 
    } 

    return fields; 
} 

List<int> baars = GetSqlFields<int>(reader, barColumnId, (dr, i) => dr.GetInt32(i)); 
+0

ありがとう、私は本当にこれが好きです。 :)それは組み込みの機能性のため、私は受け入れられたとして他の答えをマークしました。私はあなたの答えによって何か新しいことを学んだ。 – bencemeszaros

関連する問題