這裏是一對夫婦的擴展方法,這將很好地包裹起來你所有的顧慮周圍從數據讀取器檢索強類型的值。如果該值爲DbNull,則將返回該類型的默認值。如果是string
這是一個班級,則會返回null
。如果該字段爲int
,則將返回0
。此外,如果您期望int?
(例如從可空的int字段中),則會返回null
。
對庫馬爾的情況下,具體用法:
string abc = datareader.GetValueOrDefault<string>(0);
一般使用
var name = GetValueOrDefault<string>(reader, "Name");
或
var name = reader.GetValueOrDefault<string>("Name");
或
var name = reader.GetValueOrDefault<string>(0);
擴展
public static class NullSafeGetter
{
public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName)
{
int ordinal = row.GetOrdinal(fieldName);
return row.GetValueOrDefault<T>(ordinal);
}
public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal)
{
return (T)(row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal));
}
}
從http://skysanders.net/subtext/archive/2010/03/02/generic-nullsafe-idatarecord-field-getter.aspx
如果值爲DBNull並且我們期待int,那麼返回0不是不好嗎?我們不應該在這種情況下拋出異常,因爲某些顯然是錯誤的 - 我們要麼期待int?或查詢產生錯誤的值類型?把0放在沒有實際價值的地方在一些特定的情況下可能是可以的,但是在一些常用的庫中有這個可能會導致一個非常微妙的錯誤,我想。 – poke 2014-02-28 14:44:48
能夠傳遞一個默認值作爲參數很方便:'public static T GetValueOrDefault(this IDataRecord row,int ordinal,T defaultValue = default(T))' –
mistika
2014-10-08 00:47:09
@poke for int的情況下,你想有T 'int?'所以返回值可以爲null。 – 2015-07-19 20:56:33