我喜歡用DataTable
而不是DataReader
。我討厭重複樣板,所以增加了一些擴展方法向DataRow
類來封裝喪氣邏輯,併爲更多可讀代碼:
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) ;
}
這裏用於從DataRow
列值的向下轉換到一個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
我肯定掛類似的擴展方法關閉DataReader的將是相當簡單的。
CS1502:'System.Data.Common.DbDataReader.IsDBNull(int)'的最佳重載方法匹配具有一些無效參數相同的錯誤 – Mark
@Mark:oops,對不起 - 更新我的答案 –