发送列“除数”中的所有值所需的精度“41”超过支持的最大精度“38”

Precision '41' required to send all values in column 'Divisor' exceeds the maximum supported precision '38'

提问人:vinay gupta 提问时间:12/10/2021 最后编辑:marc_svinay gupta 更新时间:12/10/2021 访问量:326

问:

我有一个简单的 C# 代码来使用 和 运行存储过程。该过程的输入参数之一是用户定义的数据类型。其中一列是十进制类型。SqlCommandSqlConnection

在 C# 代码中,我使用 datatable 发送此参数的值。datatable 的列类型类似于 udtt,包括 decimal 列。

当我运行代码时,出现以下错误:

发送列“除数”中的所有值所需的精度“41”超过了支持的最大精度“38”。这些值必须都适合单个精度

我的第一反应是检查数据表中是否有任何十进制值的精度大于 38。令我惊讶的是,十进制列的最大精度值为 32。

我试图在较小的集合中分解数据表行,以找出导致问题的确切值。当我使用 50 行的集合来执行该过程时,我得到了同样的错误。但是,当我尝试收集 10 行时,所有 10 行收集的过程执行都成功。

我可以用它来避免错误。但这会导致我们的数据出现问题。decimal.Round()

有谁知道为什么 .NET Framework 在我的数据中的最大精度为 32 时会引发精度错误?

C# SQL-Server 数据表 精度 用户定义类型

评论

0赞 AlwaysLearning 12/10/2021
您是否通读了精度、小数位数和长度文档?它演示了如何计算加法、减法、乘法和除法运算结果所需的精度和小数位数。
0赞 AlwaysLearning 12/10/2021
上面的文档还说,结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,将降低到 38,并减少相应的小数位数,以防止截断结果的整数部分。在某些情况下,例如乘法或除法,不会降低比例因子以保持十进制精度,但可能会引发溢出误差。
0赞 vinay gupta 12/10/2021
感谢您的回复。是的,我已经阅读了文档。就我而言,所有计算都是用 C# 代码完成的。计算完成后,我检查了 c# 数据表中的十进制列值。任何值的精度都不能大于 38。当我将整个数据表作为 c 的 proc 输入传递时仍然出错#
0赞 Charlieface 12/10/2021
我猜一猜,我认为你的问题是你的小数点范围太宽了,有些非常大,有些非常小。如果没有一个最小的可重复的例子,我们真的无能为力
0赞 vinay gupta 12/10/2021
@Charlieface 是的,十进制值的范围从小数点后 0 位到最多 28 位小数点后。如果这是问题所在,我该怎么做才能验证这一点?我可以在这里分享附件吗?对不起,第一次在这里提问。

答: 暂无答案