C# 使用参数调用存储过程

C# 使用参数调用存储过程,c#,entity-framework,C#,Entity Framework,我有一个存储过程,它返回一个值,而不是一个数据集,我在使用EF4时遇到了问题 我看到了: 下面是我所做的:我向模型中添加了一个过程,并导入了一个函数 我遇到的第一个问题是,我的过程中的参数的命名类似于中的@\u Parameter\u。这使得EF在中将它们作为p_参数_引入,因为它不能使用下划线作为第一个字符。然后,当我调用存储过程时,我可以在SQL Profiler调用中看到它在中查找@p_Parameter_,这当然是有问题的 现在我重新命名了参数,并查看了SQL跟踪-一切看起来都很好。问题

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

我看到了:

下面是我所做的:我向模型中添加了一个过程,并导入了一个函数

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

现在我重新命名了参数,并查看了SQL跟踪-一切看起来都很好。问题是我无法计算出这个值。下面是我的代码的外观:

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
。由于某种原因,“创建新的复杂类型”已被禁用。有人遇到过这个问题吗?

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

我相信您希望在EDM中定义一个新函数,并将其指向存储过程。一个快速的谷歌有这个潜在的解决方案:


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?),这导致始终不返回任何内容


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

这是需要考虑的问题,我可以修改过程使其像这样工作。目前我不返回标量值。我给存储过程中的输出参数赋值。这也不起作用。我得到错误“存储数据提供程序返回的数据读取器没有足够的列用于请求的查询”确定,我使其工作。将select@MyValue放在存储过程的末尾。如果可以将输出参数与EF一起使用,问题仍然存在。请澄清,newkey_是否在存储过程中用“OUTPUT”关键字标记,并且是否为其选择了一个值?是的,它是在输出时标记的。自PlanADO和LINQtoSQL时代以来,这个存储过程就一直存在。最后,我在proc的末尾执行了selectnewkey_(基本上获取数据集),并在EF中使用了标量输出类型。这修复了它,但我不喜欢:(我希望有一种方法可以按原样调用它。按原样调用参数名称。我们在DB端有大量代码,命名约定是@u parameter_in和@u parameter_out。EF不能与名称一起使用。我将标记您的答案,因为我通过您的链接使其工作