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
.
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. –
Siempre uso, datareader ["column1"], mucho mejor para leer. –
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'. –