データリーダーの値を取得するためのベストプラクティスは何だろうと思っています。例えば:
私はこれをやっています:
MyValue = Dr("ColumnName")
しかし、他の人がしていることに気づきました:
MyValue = Dr.GetString("ColumnName")
2番目の方法の利点を知りたいと思っています
DbDataReader.GetString(int) メソッドは、列のインデックスがわかっている場合にのみ使用できます。そのようなオーバーロードがないため、DbDataReader.GetString("ColumnName") を使用することはできません。つまり、次の 2 つのオプションがあります。
string myValue1 = (string) Dr["ColumnName"];
string myValue2 = Dr.GetString(columIndex);
最初の行は内部的に DbDataReader.GetOrdinal("ColumnName") を呼び出します。
そのために、いくつかの一般的な拡張メソッドを作成しました。
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
あなたは絵を手に入れます...私は値型も持っています。
私はしばらくの間、同様のことを行うラッパーを使用してきましたが、これはうまく機能します。
RowHelper helper = new RowHelper(Dr);
MyValue = helper.IntColumn("ColumnName");
これの良いところは、ヘルパーが NULL 列に対して事前定義されたデフォルトを返すことです (これは構成可能です)。すべての主要な SQL データ型のメソッドがあります。
あなたの質問に答えるために、2 番目の方法にはボックス化/ボックス化解除のオーバーヘッドがありますが、これを典型的なビジネス アプリケーションに最適化するのはおそらく時間の無駄です。
DataReader はオブジェクト型を返すため、値を DataReader から任意の型 MyValue にキャストする必要があるため、int の場合
MyValue = (int)Dr("ColumnName");
また
MyValue = Convert.ToInt(Dr("ColumnName"));
また
MyValue = Dr("ColumnName").ToInt();
パフォーマンスの違いについてはよくわかりませんが、非常に大きなデータセットで作業しない限り、マイクロ最適化と解釈できると思います
AutoMapper の使用:
var dataReader = ... // Execute a data reader
var views = Mapper.Map<IDataReader, IEnumerable<SomeView>>(_dataReader);