Lubię używać DataTable
zamiast DataReader
. Nienawidzę powtarzalne boilerplate, więc dodałem kilka metod rozszerzenie do do klasy DataRow
do hermetyzacji przybitej logiki i uczynić dla kodu bardziej czytelny:
DataTable dt = ExecStoredProcedure() ;
foreach (DataRow dr in dt)
{
int id = dr.CastAsInt("id") ;
dateTime? dtLastUpdated = dr.CastAsDateTimeNullable("last_update_date") ;
int? col3 = dr.CastASIntNullable(3) ;
}
tu kod na rzutowanie w dół wartość kolumny z DataRow
do int
/int?
:
#region downcast to int
public static int CastAsInt(this DataRow row , int index)
{
return toInt(row[index]) ;
}
public static int CastAsInt(this DataRow row , string columnName)
{
return toInt(row[columnName]) ;
}
public static int? CastAsIntNullable(this DataRow row , int index)
{
return toIntNullable(row[index]);
}
public static int? CastAsIntNullable(this DataRow row , string columnName)
{
return toIntNullable(row[columnName]) ;
}
#region conversion helpers
private static int toInt(object o)
{
int value = (int)o;
return value;
}
private static int? toIntNullable(object o)
{
bool hasValue = !(o is DBNull);
int? value = (hasValue ? (int?) o : (int?) null) ;
return value;
}
#endregion conversion helpers
#endregion downcast to int
pewno wisi podobnych metod przedłużających off DataReader byłoby dość proste.
CS1502: Najlepiej przeciążona metoda dopasowania dla "System.Data.Common.DbDataReader.IsDBNull (int)" ma pewne nieprawidłowe argumenty ten sam błąd – Mark
@ Mark: oops, przepraszam - zaktualizował moją odpowiedź –