ASP.NET 4 MVC Decimal Overflow with Fluent NHibernate and SQ

本文关键字:Fluent NHibernate and SQ with Overflow NET MVC Decimal ASP | 更新日期: 2023-09-27 18:36:21

以下问题在 Web API 应用程序上运行 ASP.NET MVC 4 通过 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中保存任何值,但事实并非如此。该数字会导致溢出异常。我相信这是因为数量限制,在其参考中描述:C#和SQL Server。

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

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

ASP.NET 4 MVC Decimal Overflow with Fluent NHibernate and SQ

我真的不明白这种表示法,-7.9x1028 to 7.9x1028(来自 C# 参考)

我更喜欢十进制结构 (MSDN) 中的解释。

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

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

问题是大于 9x10 28 的

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

事实上,如果你尝试写

十进制 d =

9999999999999999999999999999999m;

您将收到一个错误,指出"常量值计算中溢出"。

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

写入时似乎没有发出错误

decimal d = 999999999999999.99999999999999m ;

但是发生了一些四舍五入。对SQLite数据库的问题运行一些测试,碰巧作为参数传递的数字是

1000000000000000.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

尝试在 (29,14) 列中插入

1000000000000000.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000