この質問に似ていますが、私が知りたいことに対する答えは実際には得られませんでした。DataReaderから値を取得するための標準はありますか?つまり、これですか
dataReader.GetString(dataReader.GetOrdinal("ColumnName"));
これと同じ/悪い/同じだと思いますか?
(string) dataReader["ColumnName"];
この質問に似ていますが、私が知りたいことに対する答えは実際には得られませんでした。DataReaderから値を取得するための標準はありますか?つまり、これですか
dataReader.GetString(dataReader.GetOrdinal("ColumnName"));
これと同じ/悪い/同じだと思いますか?
(string) dataReader["ColumnName"];
これが私がそれをする方法です:
Int32 ordinal = dataReader.GetOrdinal("ColumnName");
if (!dataReader.IsDBNull(ordinal))
yourString = dataReader.GetString(ordinal);
DBNull
上記のようにチェックすることが重要です。フィールドがnullの場合、DataReader
取得しようとすると例外がスローされるためです。
IDataReader
を列挙可能として扱い、null許容のintを返すなどして処理できるように、いくつかの拡張メソッドを作成しましたDbNull
。これにより、nullをチェックし、C#??
演算子でデフォルト値を適用できます。
/// <summary>
/// Returns an IEnumerable view of the data reader.
/// WARNING: Does not support readers with multiple result sets.
/// The reader will be closed after the first result set is read.
/// </summary>
public static IEnumerable<IDataRecord> AsEnumerable(this IDataReader reader)
{
if (reader == null)
throw new ArgumentNullException("reader");
using (reader)
{
while (reader.Read())
{
yield return reader;
}
}
}
public static int? GetNullableInt32(this IDataRecord dr, string fieldName)
{
return GetNullableInt32(dr, dr.GetOrdinal(fieldName));
}
public static int? GetNullableInt32(this IDataRecord dr, int ordinal)
{
return dr.IsDBNull(ordinal) ? null : (int?)dr.GetInt32(ordinal);
}
...他のGetDataType()
メソッドについても同様IDataReader
です。