3

フレームワーク4には、データリーダーからnull値を受け取ることができるフィールド拡張メソッドがあると聞きました。これにより、nullでない場合は最初にテストするプロセスを経ることなく、...などです。拡張メソッドに関する情報はここにあります(MSDN)、しかし私はそれをコードで使用する方法を知りません(.netは比較的新しく、以前は拡張メソッドを使用したことがありません)。誰かが例を挙げていただければ幸いです。

これは私が実装しようとしたものですが、いずれかの列にdbnullが返されるとエラーが返されます。

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

2 に答える 2

6

これらの拡張メソッドは、関連していますDataRow-つまりDataTable... not IDataReader(など)。ただし、条件付きでここで必要なことを実行できますIIf-VBまたはC#で:

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

もちろん、これらをユーティリティ メソッドとしてラップすることもできます。おそらく、独自のカスタム拡張メソッドとしてIDataReader:

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#を読むほうがよいでしょう)

于 2012-02-27T12:03:53.810 に答える
1

DataRow拡張メソッドを使用するには、 DataRow. にはメソッドがないため、リーダーを(C# で)DataReaderにロードする必要があります。DataTable

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

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

これは、DataReader.Read() メソッドを使用することと論理的に同等ではないことに注意してください。これは、リーダーを にロードするときにリーダー全体をメモリにロードすることになるためDataTableです。行セットが大きい場合、これにより問題が発生する可能性があります。

于 2012-02-27T12:03:47.803 に答える