2009-12-06 30 views
9

similares a this question, pero las respuestas realmente nunca llegó a lo que yo quiero saber. ¿Hay alguna norma para obtener valores de un DataReader? Es decir, ¿es estoDataReader mejores prácticas

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

considerado mejor/peor/lo mismo que esto?

(string) dataReader["ColumnName"]; 

Respuesta

11

Aquí es la forma en que lo hago:

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

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

Es importante comprobar la DBNull como he mostrado anteriormente, porque si el campo es nulo en el DataReader será una excepción cuando intentas recuperarlo

+0

Absolutamente de acuerdo. Pregunto más sobre las diferencias sintácticas para obtener el valor real, utilizando la funcionalidad ItemReaders Item [] frente a los métodos proporcionados DataReader.Get . –

+0

Siempre uso, datareader ["column1"], mucho mejor para leer. –

+3

Dado que el formato 'datareader [" columna "]' devuelve un objeto y no está fuertemente tipado, no creo que obtenga una excepción en ese momento si los datos son 'DbNull'. Obtendrás el molde 'DbNull.Value' en' object'. Por supuesto, puede obtener una excepción más adelante cuando intente usar el valor si no hace primero una comprobación 'Convert.IsDbNull'. –

9

he hecho algunos métodos de extensión que me permita tratar una IDataReader como numerable, y para hacer frente a DbNull devolviendo enteros con valores nulos, etc. Esto me permite comprobar NULL y aplicar un valor predeterminado con el operador de 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); 
} 

... y así sucesivamente para los otros métodos en GetDataType()IDataReader.

+0

Simplemente puede llamar a 'reader.Cast ()'. – SLaks

+1

Bueno, podrías si 'IDataReader' tuviera algo que ver con' IEnumerable'. Sin embargo, éste no es el caso. La firma es: 'IDataReader interfaz pública: IDisposable, IDataRecord' –

+0

Niza, pero es posible que desee cerrar el lector después de la:' while (reader.Read()) 'bucle –