【问题标题】:nullable decimal from SqlDataReader来自 SqlDataReader 的可空小数
【发布时间】:2014-03-03 20:43:26
【问题描述】:
我使用 SqlDataReader 从 SQL 数据表中读取一些值。值是十进制的,但它也称为 null。我如何分配它?我已经这样尝试过了,但是如果 myValue 为空,它会抛出“指定的强制转换无效”异常。
decimal? d= (decimal)myRdr["myValue"];
最好的方法是什么?
谢谢。
【问题讨论】:
标签:
c#
nullable
sqldatareader
【解决方案1】:
这个怎么样?
decimal? d= myRdr["myValue"] == DBNull.Value ? null : (decimal?)myRdr["myValue"];
【解决方案2】:
试试这个:
decimal? d = myRdr["myValue"] != DBNull.Value ? (decimal)myRdr["myValue"] : null;
【解决方案3】:
这应该可行:
decimal? d = myRdr["myValue"] == DBNull.Value ? null : decimal.Parse(myRdr["myValue"].ToString());
【解决方案4】:
decimal? d = myRdr[columnName] as decimal?;
以上,在扩展方法中:
public static decimal? GetNullableDecimal(this SqlDataReader myRdr, string columnName, decimal? valueIfNull = null)
{
return myRdr[columnName] as decimal? ?? valueIfNull;
}
用法:
decimal? d = myRdr.GetNullableDecimal("myValue");
decimal? d = myRdr.GetNullableDecimal("myValue", valueIfNull: 0);
脚注
免责声明。我只读过这个,没有测试过:据说“as”转换比前缀(显式)转换快 5 倍:http://gen5.info/q/2008/06/13/prefix-casting-versus-as-casting-in-c/