【问题标题】:ASP.NET 4 MVC Decimal Overflow with Fluent NHibernate and SQL Server 2008 RC2ASP.NET 4 MVC 十进制溢出与 Fluent NHibernate 和 SQL Server 2008 RC2
【发布时间】:2013-10-21 19:55:29
【问题描述】:

以下问题在 ASP.NET MVC 4 中的 Web API 应用程序上运行,该应用程序通过 Fluent NHibernate 连接到 SQL Server 2008 R2。

所以我有一个可以存储 十进制 数字的表单,该数字可以保存 15 个整数和 14 个小数位的值。数据库列定义为decimal(29,14),因此映射属性Map((x) => x.Factor).Column("FACTOR").Precision(29).Scale(14).Not.Nullable()

该字段的数据应该包含此掩码999999999999999.99999999999999 中的任何值,但它没有。该数字会导致 OverflowException。我相信这是因为数量限制,在其参考文献中有所描述:C#SQL Server

我真的不明白这个符号,-7.9x1028 to 7.9x1028(来自 C# 参考)或-10^38 +1 to 10^38 -1(来自 SQL Server 参考),但我认为限制数字的是 SQL Server 小数,因为错误在事务提交操作上。 ViewModel 显示正确的数字。

我需要在表格列上设置什么精度/比例才能接受应用程序值?

【问题讨论】:

    标签: c# sql-server asp.net-mvc nhibernate fluent-nhibernate


    【解决方案1】:

    我真的不明白这个符号,-7.9x1028 to 7.9x1028(来自 C# 参考)

    我更喜欢 Decimal Structure (MSDN) 中的解释。

    Decimal 值的二进制表示由 1 位符号组成, 一个 96 位整数,以及一个用于划分 96 位整数并指定它的哪一部分是小数部分。 比例因子是隐含的数字 10,升为指数 范围从 0 到 28。因此,a 的二进制表示 十进制值形式,((-296 to 296) / 10(0 to 28)),其中 -(296-1) 等于 MinValue,296-1 等于 MaxValue。

    你的十进制数应该写成 9(重复 29 次)/1014

    问题在于大于 9x1028 的 9(重复 29 次)太大而无法转换为 96 位整数表示(最大值为 7.9x1028 您的第一个定义,您将在上面链接的备注中检索)

    其实,如果你试着写

    十进制 d = 99999999999999999999999999999m;

    您将收到一条错误消息,指出“常量值计算中的溢出”。

    我想要记住的是: 您最多可以有 29 个有效数字,只要这些有效数字不构成大于 7.9x10 的整数28

    写的时候好像没有报错

    decimal d = 999999999999999.99999999999999m ;
    

    但是会发生一些舍入。使用SQLite 数据库对您的问题运行一些测试,碰巧作为参数传递的数字是 1000000000000000.0000000000000,即 (29,13),不能转换为 (29,14)。

    尝试在 (29,14) 列中插入 1000000000000000.0000000000000 会导致“将数字转换为数字数据类型时出现算术溢出错误。”

    【讨论】:

      猜你喜欢
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2011-02-11
      • 1970-01-01
      相关资源
      最近更新 更多