我们使用类似于下面的现有数据库存储过程返回十进制输出,
CREATE PROCEDURE spTest(@a int, @b decimal(18,2) output)
as
BEGIN
SELECT @b=23.22
SELECT * FROM <TABLE> where id = @a
END
Run Code Online (Sandbox Code Playgroud)
当我在C#app(下面的代码)中调用存储过程时,我得到输出参数的结果为23而不是23.22
ObjectParameter b = new ObjectParameter("b", typeof(System.Decimal))
var result = myentities.context.spTest(1234, b)
Run Code Online (Sandbox Code Playgroud)
这个问题完全由Imre Horvath发布(http://social.msdn.microsoft.com/Forums/en-US/14bdde82-c084-44dd-ad83-c1305cb966d2/decimal-output-parameter-rounded-to-integer)但不同的是我们使用的是SQL Server 2008和实体框架5.0.从他的帖子中读到建议后,我在xml编辑器中打开了edmx文件,并注意到以下输出参数@b,如下所示,
<Parameter Name="b" Type="decimal" Mode="InOut"/>;
Run Code Online (Sandbox Code Playgroud)
我改成了
<Parameter Name="b" Type="decimal" Mode="InOut" Precision="18" Scale="2"/>;
Run Code Online (Sandbox Code Playgroud)
并运行应用程序,我得到了预期的结果(23.22)
这是一种解决方法,但不是解决方案,因为您知道当我们更新实体框架设计器中的存储过程时,更改将会丢失.在我们的数据库中,我们有许多存储过程,其中包含十进制(18,2)作为输出参数.我想知道这是否仍然是实体框架5.0中的一个问题.非常感谢您的帮助.
库马尔
小智 8
我和你有同样的问题,在我从这篇文章中引用后我已经解决了这个问题http://tiku.io/questions/1120572/decimal-output-parameter-rounded-to-integer-in-ef5-0
解决此问题有3个步骤:
<Parameter Name="b" Type="numeric" Mode="InOut" />然后替换它<Parameter Name="b" Type="numeric" Mode="InOut" Precision="20" Scale="2" /><Parameter Name="b" Mode="InOut" Type="Decimal" />然后替换它<Parameter Name="b" Mode="InOut" Type="Decimal" Precision="20" Scale="2" />希望对你有帮助!
在 EF6 中,我遇到了同样的问题!但是找到一个简单的解决方案。我尝试设置输出 ObjectParameter 值,然后返回带刻度的小数,如 5602.86
public decimal GetQuotationAmount(string rec_id, decimal price)
{
ObjectParameter qTA_AMT = new ObjectParameter("QTA_AMT", typeof(decimal));
qTA_AMT.Value = 100000.00m;
db.GRP_Calc_QuotationAmount(rec_id, price,qTA_AMT);
return Convert.ToDecimal(qTA_AMT.Value);
}
Run Code Online (Sandbox Code Playgroud)