代码之家  ›  专栏  ›  技术社区  ›  I. J. Kennedy ShankarSangoli

为什么GetSqlDecimal抛出而GetDecimal不抛出?

  •  2
  • I. J. Kennedy ShankarSangoli  · 技术社区  · 15 年前

    money ,允许空值。使用 SqlDataReader

    decimal d = reader.GetDecimal(1);
    

    当然,除非我们读的是空值。如果我试着用 SqlDecimal 相反,我认为SqlTypes的全部目的是处理nulls当我得到一个无效的cast时, 值是否为空 .

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

    我做错什么了?我真的需要写一个条件语句来将值从数据库中引导到 SqlDecimal

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jonathan Allen    15 年前

    我打赌你的值是十进制的,但不是十进制的。

    SqlDecimal的底层数据结构与其对应的.NET Framework Decimal数据类型不同。

    http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldecimal.aspx

        2
  •  1
  •   Andrew    15 年前

    我怀疑列中的值已经是十进制,而不是sqldecimal,因为您使用的是money(我认为是18,4),而不是38精度的十进制。如果以全精度直接生成SqlDecimal,会发生这种情况吗?

    ,一个常规小数点就足够了。在这种情况下,由于十进制在某种程度上是较低的“精度”,所以不会丢失任何东西。所有下游代码的使用也会变得更容易。

    或者你可以这样做:

    SqlDecimal s = new SqlDecimal(reader.GetDecimal(1));