9

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

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

当我在 C# 应用程序(下面的代码)中调用存储过程时,我得到输出参数的结果为 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 中是否仍然是一个问题。您的帮助将不胜感激。

库马尔

4

3 回答 3

10

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

有 3 个步骤可以解决此问题:

  1. 右键单击 edmx 文件 => 打开方式... => 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" />

希望对你有帮助!

于 2015-01-24T17:29:19.610 回答
6

在 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);
}
于 2014-07-18T06:55:17.837 回答
2

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

更新
我最近更新到 EF 6.0,不,问题仍未解决。我猜 EF 6.0 现在是开源的,所以如果你喜欢这种东西,你总是可以自己修补它。

于 2013-10-24T19:37:24.770 回答