SqlTruncateException:数值算术导致截断

时间:2017-02-01 18:15:05

标签: c# .net sql-server sqlclient

我们有一个存储过程可以将余额保存到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找不到解释。

1 个答案:

答案 0 :(得分:1)

你确定它的精确度而不是规模吗?你知道失败的确切小数吗?小数点后有可能超过4位吗? SQL Server MONEY在小数点后只有4位数,而十进制没有该限制。 https://msdn.microsoft.com/en-us/library/ms179882.aspx