c# - Linq 到 SQL : Why decimal field get truncated on Insert?

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

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

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

有没有办法在不更改所有小数列的情况下更改此行为?

谢谢

最佳答案

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

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

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

如果您对手动修改所有这些列持谨慎态度,只需编写一个脚本来为您完成。但是您确实需要手动维护正确的数据类型,这是没有办法解决的。

关于c# - Linq 到 SQL : Why decimal field get truncated on Insert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32092062/

相关文章:

C# EF6 LINQ 从 include() 中的子级中选择多个第二个子级

C# MVVM DataGrid 绑定(bind)策略?

c# - 页面.FindControl?

xml - 我无法读取 xdocument 中的子元素

sql - 如果我的表定义更新了,为什么 View 没有更新?

java - 查看加密的数据库数据

c# - 如何在 C# 中从数据库检索时将 varBinary 转换为图像或视频

c# - 在同一装配空间中动态生成模块

c# - Xamarin.iOS,将字典转换为 NSDictionary

sql-server - 如何结合 SQL Azure 在 SQL Management Studio 中将特定单元格设置为 null