Linq to SQL:为什么十进制字段在插入时被截断?
Linq to SQL: Why decimal field get truncated on Insert?
我有一列定义为 decimal(10,6)
。当我尝试用值 10.12345
保存模型时,在我保存为 10.123400 的数据库中。最后一位数字(“5”)被截断。
为什么 LINQ 中的数字默认只有 4 位数字(十进制),我如何才能避免模型中所有列出现这种情况?我找到的解决方案是使用 DbType="Decimal(10,6)"
,但在这种情况下我有很多列,更改应该应用于所有列,我认为这不是个好主意。
有没有办法在不更改所有小数列的情况下更改此行为?
谢谢
在这种情况下,您需要使用正确的 DbType,decimal(10, 6)
。
原因很简单——.NET 的 decimal
实际上是一个(十进制)浮点数(小数点可以移动),而 MS SQL 不是。这是一个固定的"four left of decimal point, six right of decimal point"。当 LINQ 将 decimal
传递给 MS SQL 时,它 必须 使用特定的 SQL 十进制 - 而默认值恰好使用四规模。你总是可以使用一个足够大的 decimal
来满足你试图传递的任何值,但这是非常不切实际的——一方面,它几乎会消除执行计划缓存,因为每个不同的 decimal(p, s)
都需要它自己的单独查询。如果您要传递多个小数位,这意味着您几乎永远不会获得缓存计划;哎哟
实际上,该命令不会发送值 10.12345
- 它会发送 10123450
(不完全正确,但请耐心等待)。因此,当您传递参数时,您 必须 知道比例 - 例如,您需要将 10
作为 10000000
发送。当您不使用 LINQ 时同样适用 - 手动使用 SqlCommand
具有相同的 "issue",并且您必须使用特定的精度和比例。
如果您对手动修改所有这些列持谨慎态度,只需编写一个脚本来为您完成。但是您确实需要手动维护正确的数据类型,这是没有办法的。
我有一列定义为 decimal(10,6)
。当我尝试用值 10.12345
保存模型时,在我保存为 10.123400 的数据库中。最后一位数字(“5”)被截断。
为什么 LINQ 中的数字默认只有 4 位数字(十进制),我如何才能避免模型中所有列出现这种情况?我找到的解决方案是使用 DbType="Decimal(10,6)"
,但在这种情况下我有很多列,更改应该应用于所有列,我认为这不是个好主意。
有没有办法在不更改所有小数列的情况下更改此行为?
谢谢
在这种情况下,您需要使用正确的 DbType,decimal(10, 6)
。
原因很简单——.NET 的 decimal
实际上是一个(十进制)浮点数(小数点可以移动),而 MS SQL 不是。这是一个固定的"four left of decimal point, six right of decimal point"。当 LINQ 将 decimal
传递给 MS SQL 时,它 必须 使用特定的 SQL 十进制 - 而默认值恰好使用四规模。你总是可以使用一个足够大的 decimal
来满足你试图传递的任何值,但这是非常不切实际的——一方面,它几乎会消除执行计划缓存,因为每个不同的 decimal(p, s)
都需要它自己的单独查询。如果您要传递多个小数位,这意味着您几乎永远不会获得缓存计划;哎哟
实际上,该命令不会发送值 10.12345
- 它会发送 10123450
(不完全正确,但请耐心等待)。因此,当您传递参数时,您 必须 知道比例 - 例如,您需要将 10
作为 10000000
发送。当您不使用 LINQ 时同样适用 - 手动使用 SqlCommand
具有相同的 "issue",并且您必须使用特定的精度和比例。
如果您对手动修改所有这些列持谨慎态度,只需编写一个脚本来为您完成。但是您确实需要手动维护正确的数据类型,这是没有办法的。