Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq to SQL:为什么在插入时会截断十进制字段?_C#_Sql Server_Linq_Decimal_Decimal Point - Fatal编程技术网

C# Linq to SQL:为什么在插入时会截断十进制字段?

C# Linq to SQL:为什么在插入时会截断十进制字段?,c#,sql-server,linq,decimal,decimal-point,C#,Sql Server,Linq,Decimal,Decimal Point,我有一列定义为十进制(10,6)。当我试图用值10.12345保存模型时,我在数据库中保存为10.123400。最后一个数字(“5”)被截断 为什么LINQ中的数字默认为4位(十进制),我如何避免模型中的所有列出现这种情况?我找到的解决方案是使用DbType=“Decimal(10,6)”,但在这种情况下,我有很多列,更改应该应用于所有列,我认为这不是一个好主意 有没有一种方法可以在不更改所有十进制列的情况下更改此行为 谢谢在这种情况下,您需要使用正确的数据库类型,decimal(10,6) 原

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

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

有没有一种方法可以在不更改所有十进制列的情况下更改此行为


谢谢

在这种情况下,您需要使用正确的数据库类型,
decimal(10,6)

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

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


如果您担心手动修改所有这些列,只需编写一个脚本即可。但是您确实需要手动维护正确的数据类型,这是无法避免的。

当前数据库字段的类型是什么?花车?(精度约为7位)字段的类型为decimal(10,6)。我的意思是,它映射到什么CLR/属性类型?映射到decimal。