我们使用类似于下面的现有数据库存储过程返回十进制输出
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中的一个问题。 非常感谢您的帮助。
库马尔
答案 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" />
希望这会对你有帮助!
答案 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所以你可以自己修补它,如果你是这样的话。