繁体   English   中英

使用参数调用存储过程

[英]Calling stored procedure with parameters

我有一个存储过程返回一个值,而不是一个数据集,我有问题让它与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 出于某种原因,我禁用了“创建新的复杂类型”。 有谁有这个问题?

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

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

HTH

问题是在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()函数解决单行或值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM