GetDecimal为什么不抛出GetSqlDecimal?

时间:2010-03-30 22:48:04

标签: c# .net sql

我有一个数据库表,其中包含money类型的列,允许空值。使用SqlDataReader命名的阅读器,我可以

decimal d = reader.GetDecimal(1);

哪个有效,除非我们正在阅读null。如果我尝试使用SqlDecimal代替 - 我认为SqlTypes的重点是处理空值 - 然后我得到一个无效的强制转换,值是否为null

SqlDecimal s = reader.GetSqlDecimal(1);  // throws an invalid cast exception

我做错了什么?我是否真的必须编写一个条件语句来将数据库中的值转换为SqlDecimal变量?

2 个答案:

答案 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));