我很好奇爲什麼你會定義你的應用程序代碼變量爲空,但如果它爲空,然後將其設置爲0。如果將數據庫中的空值傳遞給應用程序變量,是否僅僅是爲了避免異常?如果您的應用程序並不絕對需要的可空小數變量,只是檢查了的DBNull爲你讀出來:
decimal myAppVal = rdr["DbColumn"] == DBNull.Value
? default(decimal)
: (decimal) rdr["DbColumn"];
或明確設置的,而不是使用默認值(十進制)
0.0M在設計方面,如果你發現自己經常這樣做,那麼我會建議創建一個通用擴展方法來從數據庫中讀取值。通過這種方式,您可以確保避免無效轉換並處理異常,但更重要的是,在空值情況下會返回默認值。 ;)
喜歡的東西(我只是spitballing這裏):
public static T CastFromDbTo<T>(object readerObject)
{
T returnVal = default(T);
if (readerObject is T)
{
var myValue = (T) readerObject;
returnVal = readerObject != DbNull.Value && myValue != null
? (T) readerObject
: default(T);
}
return returnVal;
}
然後,你可以抓住這樣你的價值:
var myAppValue = HelperClass.CastFromDbTo<decimal>(rdr["DbColumn"]);
或實際提出延期:
public static T CastFromDbTo<T>(this object readerObject)
{
T returnVal = default(T);
if (readerObject is T)
{
var myValue = (T) readerObject;
returnVal = readerObject != DbNull.Value && myValue != null
? (T) readerObject
: default(T);
}
return returnVal;
}
然後你可以這樣做:
var myAppVal = rdr["DbColumn"].CastFromDbTo<decimal>();
您的原始解決方案很髒,如果新解決方案很髒,有什麼關係。如果您爲其分配默認值,那麼擁有可爲空的字段的意義是什麼? –
謝謝,我學到了很多:) –