2012-02-27 1 views
2

フレームワーク4にフィールド拡張メソッドがあると聞きましたが、nullでない場合は最初のテストのプロセスを経ることなく、データウェアハウスからnull値を受け取ることができます(MSDN)の拡張メソッドについての情報がありますが、これはコードで使用する方法がわかりません(比較的新しい.netで以前は拡張メソッドを使用していませんでした)。誰かが例を挙げることができれば感謝します。.net4のdbnull値を使ってdatareaderを使用しています

これは実装しようとしたものですが、いずれかの列でdbnullが返されるとエラーが返されます。あなたがDataRowを必要とするDataRow拡張メソッドを使用するためには

Reader.Read() 
Dim Val As Nullable(Of Double) = Reader.GetDecimal(0) 
Dim Vol As Nullable(Of Long) = Reader.GetInt32(1) 

答えて

1

。そこDataReaderには方法がないので、何をする必要がある(C#で)DataTableに読者をロードすることです:

var table = new DataTable(); 
table.Load(reader); 

foreach(DataRow row in table.Rows) 
{ 
    var value = row.Field<Decimal>(0); 
} 

DataReaderを使用して論理的に等価ではないことを認識することが重要です。 DataTableにロードするときにリーダー全体をメモリに読み込むように、Read()メソッドを呼び出します。これは、行セットが大きい場合に問題を引き起こす可能性があります。

5

これらの拡張メソッドはDataRowに関連する - 即ちDataTable ... ないIDataReader(ETC)。

double? val = reader.IsDBNull(index) ? (double?) null : reader.GetDouble(index); 
long? vol = reader.IsDBNull(index) ? (long?)null : reader.GetInt64(index); 

あなたはもちろんIDataReaderに独自のカスタム拡張メソッドとして、おそらく、ユーティリティメソッドとしてそれらを包むことができ:C#でVBでIIfを、または - あなたはしかし、あなたが条件で、ここでやりたいことができます

public static class DataReaderExtensions 
{ 
    public static int? ReadNullableInt32(this IDataReader reader, int index) 
    { 
     return reader.IsDBNull(index) ? (int?)null : reader.GetInt32(index); 
    } 
    public static long? ReadNullableInt64(this IDataReader reader, int index) 
    { 
     return reader.IsDBNull(index) ? (long?)null : reader.GetInt64(index); 
    } 
    public static double? ReadNullableDouble(this IDataReader reader, int index) 
    { 
     return reader.IsDBNull(index) ? (double?)null : reader.GetDouble(index); 
    } 
    public static string ReadNullableString(this IDataReader reader, int index) 
    { 
     return reader.IsDBNull(index) ? null : reader.GetString(index); 
    } 
    // etc 
} 

(例については、C#を使用して申し訳ありません - しかし、私は正確 vb.net書くことができるよりも、あなたはおそらくC#の良く読むことができます)

+0

感謝を - 非常に明確。 – Yugmorf

関連する問題