Linq to SQL:为什么十进制字段在插入时被截断

本文关键字:插入 字段 SQL to 为什么 十进制 Linq | 更新日期: 2023-09-27 18:08:45

我有一个定义为decimal(10,6)的列。当我尝试用值10.12345保存模型时,在数据库中我保存为10.123400。最后一个数字("5")被截断。

为什么在LINQ中默认只有4位数字(用于十进制),我如何避免模型中所有列的这种情况?我发现的解决方案是使用DbType="Decimal(10,6)",但我有很多列在这种情况下,改变应该适用于所有,我不认为这是一个好主意。

是否有一种方法可以在不改变所有小数列的情况下改变这种行为?

谢谢

Linq to SQL:为什么十进制字段在插入时被截断

在这种情况下,您需要使用正确的DbType, decimal(10, 6)

原因很简单-虽然。net的decimal实际上是一个(十进制)浮点数(小数点可以移动),MS SQL的不是。它是固定的"小数点左边4,小数点右边6"。当LINQ将decimal传递给MS SQL时,它使用一个特定的SQL小数-默认情况下恰好使用4作为刻度。您总是可以使用足够大的decimal来传递任何值,但这是非常不切实际的-首先,它将几乎消除执行计划缓存,因为每个不同的decimal(p, s)所需的将是它自己的单独查询。如果你传递多个小数,这意味着你几乎永远不会得到一个缓存计划;哎哟.

实际上,该命令不发送值10.12345 -它发送10123450(不完全正确,但请耐心听我说)。因此,当您传递参数时,必须知道比例—例如,您需要将10发送为10000000。这同样适用于当你不使用LINQ -使用SqlCommand手动有相同的"问题",你必须使用特定的精度和比例。

如果您担心手动修改所有这些列,只需编写一个脚本来完成。但是您确实需要手动维护适当的数据类型,这是没有办法的。