十进制输出参数在EF5.0中四舍五入为整数

时间:2013-08-10 22:36:26

标签: frameworks entity

我们使用类似于下面的现有数据库存储过程返回十进制输出

CREATE PROCEDURE spTest(@a int, @b decimal(18,2) output)
as
BEGIN
   SELECT @b=23.22
   SELECT * FROM <TABLE> where id = @a
END

当我在C#app(下面的代码)中调用存储过程时,我得到输出参数的结果为23而不是23.22

ObjectParameter b = new ObjectParameter("b", typeof(System.Decimal))
var result = myentities.context.spTest(1234, b)

这是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"/>;

我把它改成了

<Parameter Name="b" Type="decimal" Mode="InOut" Precision="18" Scale="2"/>;

并运行应用程序,我得到了预期的结果(23.22)

这是一种解决方法,但不是解决方案,因为您知道在我们更新实体框架设计器中的存储过程时,更改将会丢失。在我们的数据库中,我们有许多存储过程,其中包含十进制(18,2)作为输出参数。我想知道这是否仍然是实体框架5.0中的一个问题。 非常感谢您的帮助。

库马尔

3 个答案:

答案 0 :(得分:8)

我遇到了同样的问题,在我参考了这篇文章之后我已经解决了这个问题http://tiku.io/questions/1120572/decimal-output-parameter-rounded-to-integer-in-ef5-0

解决此问题有3个步骤:

  1. 右键单击edmx file =&gt;打开... =&gt; XML(文本)编辑器。
  2. 搜索文字<Parameter Name="b" Type="numeric" Mode="InOut" />,然后将其替换为<Parameter Name="b" Type="numeric" Mode="InOut" Precision="20" Scale="2" />
  3. 搜索文字<Parameter Name="b" Mode="InOut" Type="Decimal" />,然后将其替换为<Parameter Name="b" Mode="InOut" Type="Decimal" Precision="20" Scale="2" />
  4. 希望这会对你有帮助!

答案 1 :(得分:3)

在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);
}

答案 2 :(得分:2)

不,这在EF 5.0中没有修复。它可能也不会在6.0中修复。

<强>更新
我最近更新到EF 6.0,不,问题仍然没有解决。我想EF 6.0现在是Open Source所以你可以自己修补它,如果你是这样的话。