我很好奇您为什么要将您的应用程序代码变量定义为可为空,但如果它为空则将其设置为 0。如果将空值从数据库传递到您的应用程序变量,是否只是为了避免异常?如果您的应用程序并不绝对需要可为空的十进制变量,只需在读取它时检查它是否存在 DbNull:
decimal myAppVal = rdr["DbColumn"] == DBNull.Value
? default(decimal)
: (decimal) rdr["DbColumn"];
或显式设置 0.0M 而不是使用默认值(十进制)
设计方面,如果您发现自己经常这样做,那么我建议创建一个通用扩展方法来从数据库中读取值。通过这种方式,您可以确保避免无效转换并处理异常,但更重要的是,在出现空值的情况下返回默认值。;)
类似的东西(我只是在这里吐口水):
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>();