我们有一个存储过程可以将余额保存到db 今天我们得到了例外:
SqlTruncateException:数字算术会导致截断。
我们收到超过10亿的余额,这导致了这个例外。我不在乎这样的巨大价值是否错误,但我想知道SqlCient奇怪行为的原因。
我们传递了一系列余额:
public class LoroAccountBalance
{
...
public decimal? Balance { get; set; }
...
}
映射到用户定义的表类型:
create type Settlement.LoroBalanceType as table
(
...
Balance money not null,
...
)
所以.net decimal
类型映射到sql money
。
这是堆栈跟踪的最后一步:
System.Data.dll!System.Data.SqlTypes.SqlDecimal.ConvertToPrecScale(System.Data.SqlTypes.SqlDecimal n,int precision,int scale)
SqlClient决定在将其转换为货币类型之前调整小数精度
但是,它为precision
选择了一个不适合1b的值。
我想明白为什么他这样做。我在docs找不到解释。
答案 0 :(得分:1)
你确定它的精确度而不是规模吗?你知道失败的确切小数吗?小数点后有可能超过4位吗? SQL Server MONEY在小数点后只有4位数,而十进制没有该限制。 https://msdn.microsoft.com/en-us/library/ms179882.aspx