2009-12-06 10 views
9

this questionと似ていますが、答えは決して私が知りたいと思っているものではありません。 DataReaderから値を取得する際の基準はありますか?すなわち、これと同じ/ /悪いことより良いと考えられ、このDataReaderのベストプラクティス

dataReader.GetString(dataReader.GetOrdinal("ColumnName")); 

のですか?ここで

(string) dataReader["ColumnName"]; 

答えて

11

私はそれを行う方法です。

Int32 ordinal = dataReader.GetOrdinal("ColumnName"); 

if (!dataReader.IsDBNull(ordinal)) 
    yourString = dataReader.GetString(ordinal); 

フィールドがDataReaderにnullの場合、それは時に例外がスローされますので、私が上に示されているようDBNullをチェックすることが重要ですあなたはそれを取得しようとします。

+0

絶対に同意します。 DataReaders Item []機能を使用し、提供されたDataReader.Get メソッドを使用して、実際の値を取得する構文的な違いについてより詳しく質問しています。 –

+0

私はいつも、datareader ["column1"]を読むのがはるかにいいです。 –

+3

'datareader [" column "]'形式はオブジェクトを返し、強く型付けされていないので、データが 'DbNull'の場合は例外が発生するとは思われません。 'DbNull.Value'を' object'にキャストするだけです。もちろん、最初に 'Convert.IsDbNull'チェックをしないと、値を使用しようとすると例外が発生することがあります。 –

9

私はこれは私がnullかどうかを確認し、C#??オペレータにデフォルト値を適用することができますなど、私が列挙としてIDataReaderを扱うようにすると、NULL可能int型を返すことによってDbNullに対処するためにいくつかの拡張メソッドを作りました。 IDataReader上の他のGetDataType()方法について

/// <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); 
} 

...というように。

+0

単に 'reader.Cast ()'を呼び出すことができます。 – SLaks

+1

'IDataReader'が' IEnumerable'と何か関係があるとしたらどうでしょうか?しかし、そうではありません。 'public interface IDataReader:IDisposable、IDataRecord' –

+0

' while(reader.Read()) 'ループの後で読者を閉じたいかもしれません。 –