4

データリーダーの値を取得するためのベストプラクティスは何だろうと思っています。例えば:

私はこれをやっています:

MyValue = Dr("ColumnName")

しかし、他の人がしていることに気づきました:

MyValue = Dr.GetString("ColumnName")

2番目の方法の利点を知りたいと思っています

4

5 に答える 5

4

DbDataReader.GetString(int) メソッドは、列のインデックスがわかっている場合にのみ使用できます。そのようなオーバーロードがないため、DbDataReader.GetString("ColumnName") を使用することはできません。つまり、次の 2 つのオプションがあります。

 string myValue1 = (string) Dr["ColumnName"];
 string myValue2 = Dr.GetString(columIndex);

最初の行は内部的に DbDataReader.GetOrdinal("ColumnName") を呼び出します。

于 2009-02-13T11:14:52.170 に答える
3

そのために、いくつかの一般的な拡張メソッドを作成しました。

public static class DataReaderExtensions
{
    public static T GetValueOrNull<T>(this IDataRecord reader, string fieldName)
        where T : class
    {
        int index = reader.GetOrdinal(fieldName);
        return reader.IsDBNull(index) ? null : (T)reader.GetValue(index);
    }
}

GetValueOrDefaultあなたは絵を手に入れます...私は値型も持っています。

于 2009-02-13T12:45:08.647 に答える
3

私はしばらくの間、同様のことを行うラッパーを使用してきましたが、これはうまく機能します。


     RowHelper helper = new RowHelper(Dr);
     MyValue = helper.IntColumn("ColumnName");

これの良いところは、ヘルパーが NULL 列に対して事前定義されたデフォルトを返すことです (これは構成可能です)。すべての主要な SQL データ型のメソッドがあります。

あなたの質問に答えるために、2 番目の方法にはボックス化/ボックス化解除のオーバーヘッドがありますが、これを典型的なビジネス アプリケーションに最適化するのはおそらく時間の無駄です。

于 2009-02-13T11:13:45.340 に答える
1

DataReader はオブジェクト型を返すため、値を DataReader から任意の型 MyValue にキャストする必要があるため、int の場合

MyValue = (int)Dr("ColumnName");

また

MyValue = Convert.ToInt(Dr("ColumnName"));

また

MyValue = Dr("ColumnName").ToInt();

パフォーマンスの違いについてはよくわかりませんが、非常に大きなデータセットで作業しない限り、マイクロ最適化と解釈できると思います

于 2009-02-13T10:37:04.930 に答える
0

AutoMapper の使用:

var dataReader = ... // Execute a data reader
var views = Mapper.Map<IDataReader, IEnumerable<SomeView>>(_dataReader);
于 2009-10-20T15:34:58.713 に答える