我有一个数据库表,其中包含money
类型的列,允许空值。使用SqlDataReader
命名的阅读器,我可以
decimal d = reader.GetDecimal(1);
哪个有效,除非我们正在阅读null。如果我尝试使用SqlDecimal
代替 - 我认为SqlTypes的重点是处理空值 - 然后我得到一个无效的强制转换,值是否为null 。
SqlDecimal s = reader.GetSqlDecimal(1); // throws an invalid cast exception
我做错了什么?我是否真的必须编写一个条件语句来将数据库中的值转换为SqlDecimal
变量?
答案 0 :(得分:1)
我敢打赌你的值适合于Decimal而不是SqlDecimal。
SqlDecimal与其对应的.NET Framework Decimal数据类型具有不同的底层数据结构。
http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldecimal.aspx
答案 1 :(得分:1)
来自文件:
不进行转换;因此,检索到的数据必须已经是十进制值,否则会生成异常。
我怀疑列中的值已经是小数,而不是sqldecimal,因为你使用的是钱(我认为是18,4),而不是完整的38精度小数。如果您以完全精度制作一个直的SqlDecimal,是否会发生这种情况?
由于您使用 money ,因此常规小数值就足够了。在这种情况下,由于十进制在某种程度上是较低的“精度”,所以你不会丢失任何东西。所有下游代码的使用寿命也会更轻松。
或者您可以像这样进行转换:
SqlDecimal s = new SqlDecimal(reader.GetDecimal(1));