【问题标题】: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/

        【讨论】: