Linq to SQL:为什么在Insert上截断十进制字段?

时间:2015-08-19 09:49:19

标签: c# sql-server linq decimal decimal-point

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

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

有没有办法在不更改所有十进制列的情况下更改此行为?

由于

1 个答案:

答案 0 :(得分:2)

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

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

实际上,命令不发送值10.12345 - 它发送10123450(不完全正确,但只是忍受我)。因此,当您传递参数时,必须知道比例 - 例如,您需要将10作为10000000发送。当您不使用LINQ时同样适用 - 手动使用SqlCommand具有相同的“问题”,并且您必须使用特定的精度和比例。

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