C# 使用Fluent NHibernate和SQL Server 2008 RC2的ASP.NET 4 MVC十进制溢出

C# 使用Fluent NHibernate和SQL Server 2008 RC2的ASP.NET 4 MVC十进制溢出,c#,sql-server,asp.net-mvc,nhibernate,fluent-nhibernate,C#,Sql Server,Asp.net Mvc,Nhibernate,Fluent Nhibernate,以下问题在ASP.NET MVC 4中的web API应用程序上运行,该应用程序通过Fluent连接到R2中 所以我有一个可以存储一个十进制数的表单,它可以保存一个15位整数和14位小数的值。数据库列定义为decimal(29,14),因此映射的属性Map((x)=>x.Factor).列(“Factor”).精度(29).比例(14).非.Nullable() 该字段的数据应包含此掩码中的任何值99999999999999.99999999999,但它不包含。该数字会导致OverflowExc

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

所以我有一个可以存储一个十进制数的表单,它可以保存一个15位整数和14位小数的值。数据库列定义为
decimal(29,14)
,因此映射的属性
Map((x)=>x.Factor).列(“Factor”).精度(29).比例(14).非.Nullable()

该字段的数据应包含此掩码中的任何值
99999999999999.99999999999
,但它不包含。该数字会导致OverflowException。我认为这是因为参考文献中描述的数量限制:和

我真的不理解这种表示法,
-7.9x1028到7.9x1028
(来自C#引用)或
-10^38+1到10^38-1
(来自SQLServer引用),但我认为限制数字的是SQLServer小数,因为错误发生在事务提交操作上。ViewModel显示了正确的编号

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

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

我更喜欢(MSDN)中的解释

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

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

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

事实上,如果你想写

十进制d=999999999999999999999米

您将得到一个错误,说明“在常量值计算中溢出”

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

书写时似乎没有发出错误

decimal d = 999999999999999.99999999999999m ;
但有些情况会发生。使用数据库对问题运行一些测试时,作为参数传递的数字恰好是10000000000000.0000000000000,即(29,13),不能转换为(29,14)

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