SqlDataReader中可以为n的十进制数

时间:2014-02-06 18:15:03

标签: c# nullable sqldatareader

我使用SqlDataReader从SQL数据表中读取一些值。值为十进制,但调用也为null。我该如何分配?我已经尝试过这样,但是如果myValue为null,它会抛出“Specified cast is not valid”异常。

decimal? d= (decimal)myRdr["myValue"];

这样做的最佳方式是什么?

谢谢。

4 个答案:

答案 0 :(得分:3)

这个怎么样?

decimal? d= myRdr["myValue"] == DBNull.Value ? null : (decimal?)myRdr["myValue"];

答案 1 :(得分:1)

试试这个:

decimal? d = myRdr["myValue"] != DBNull.Value ? (decimal)myRdr["myValue"] : null;

答案 2 :(得分:1)

这应该有效:

decimal? d = myRdr["myValue"] == DBNull.Value ? null : decimal.Parse(myRdr["myValue"].ToString());

答案 3 :(得分:0)

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/