使用参数调用存储过程

时间:2011-02-21 16:06:14

标签: c# entity-framework

我有一个存储过程返回一个值,而不是一个数据集,我在使用EF4时遇到了问题。

我见过这个:http://dotnet.dzone.com/news/how-retrieve-stored-procedure

这就是我所做的:我在模型中添加了一个过程,并导入了一个函数。

我遇到的第一个问题是我的程序中的参数被命名为@_Parameter_in。这使得EF将它们作为p_Parameter_in引入,因为它不能用下划线作为第一个字符。然后当我调用存储过程时,我可以在SQL Profiler调用中看到它查找@p_Parameter_in,当然还有一个问题。

现在我重命名参数并查看SQL Trace - 一切看起来都很棒。问题是我无法获得价值。以下是我的代码的外观:

System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32));
newKey.Value = 0;
context.GetNextSurrogateKey_v2("tTest", newKey);

调用newKey.Value后,它始终为0或我设置的任何值。它没有带来价值。我怀疑我的问题是我如何导入该功能。我使用标量和数据类型Int32。出于某种原因,我禁用了“创建新的复杂类型”。有人有这个问题吗?

3 个答案:

答案 0 :(得分:7)

我在这里猜测,因为我看不到你正在调用的存储过程。我想你想要检索存储过程返回的标量值,而不是存储过程中定义的输出参数的值。

我相信您想在EDM中定义一个新函数并将其指向存储过程。快速谷歌有这个潜在的解决方案:http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

HTH

答案 1 :(得分:2)

问题是datareader结束读取后的EF过程输出参数。这通常是在调用DataBind()函数之后。 我有更长的处理程序同样的问题。我通过在ObjectResult上使用.ToList()函数来解决这个问题。

var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));    
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList();
this.ProductsCount = (int?)rowsCount.Value;

您可以使用FirstOrDefault()函数解决单行或值。

答案 2 :(得分:0)

我和Jan Remunda描述的问题一样。有人将返回类型从Integer更改为Entity.Core.Objects.ObjectResult(Integer?),导致始终不返回任何内容。

对于我们来说,解决方案是强制EF通过将.FirstOrDefault()函数添加到返回来读取存储过程的返回。