使用参数调用存储过程

8
我有一个存储过程,它返回的是一个值而不是数据集,我在使用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或我设定的任何值。它不会带回值。我怀疑我的问题在于如何导入函数。我使用Scalars和数据类型Int32。出于某种原因,对我禁用了“创建新的复杂类型”。有人遇到过这个问题吗?
3个回答

7
我猜测您想要检索存储过程返回的标量值,而不是存储过程中定义的输出参数的值。由于我无法查看您调用的存储过程,因此这只是我的猜测。
我认为您需要在EDM中定义一个新的函数,并将其指向存储过程。通过快速搜索,我找到了一个潜在的解决方案:http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values 希望对您有所帮助。

那是值得关注的事情,我可能会修改过程以使其像这样工作。目前我没有返回标量值。我将值分配给存储过程中的OUTPUT参数。 - katit
那也不行。我收到了错误信息:“存储数据提供程序返回的数据读取器对于所请求的查询没有足够的列。” - katit
好的,我成功了。通过在存储过程末尾放置select @MyValue。问题仍然存在,即是否可以在EF中使用输出参数。 - katit
只是为了明确,newkey_out在存储过程中是否标记为“output”关键字,并且是否将一个值选择给它? - Dave
1
是的,它在输出处被标记了。这个存储过程从ADO和LINQtoSQL时代就一直存在。最终我在proc的末尾执行了SELECT newkey_out(基本上获取数据集),并在EF中使用了标量输出类型。这解决了问题,但我不喜欢它:( 我希望有一种方法可以像以前一样调用它。使用参数名称就像以前一样。我们有大量的DB端代码,命名约定是@_Parameter_in和@_Parameter_out。EF不能使用这些名称。由于你提供的链接,我已经让它工作了,所以我会标记你的答案。 - katit
显示剩余2条评论

2
问题在于EF在DataReader结束读取后处理输出参数。通常是在调用DataBind()函数之后。我曾经遇到过长时间处理过程的同样问题。我通过在ObjectResult上使用.ToList()函数来解决这个问题。
var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));    
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList();
this.ProductsCount = (int?)rowsCount.Value;

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


0

我遇到了与Jan Remunda描述的相同问题。有人将返回类型从Integer更改为Entity.Core.Objects.ObjectResult(of Integer?),导致始终返回空值。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接