【问题标题】:Calling stored procedure with parameters带参数调用存储过程
【发布时间】:2011-02-21 16:06:13
【问题描述】:

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

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

    HTH

    【讨论】:

    • 那是要看看的东西,我可能只是修改程序来像这样工作。目前我不返回标量值。我在存储过程中为 OUTPUT 参数赋值。
    • 那也行不通。我收到错误“商店数据提供程序返回的数据读取器没有足够的列用于请求的查询”
    • 好的,我成功了。将 select @MyValue 放在存储过程的末尾。如果可以将 OUTPUT 参数与 EF.. 一起使用,问题仍然悬而未决。
    • 要清楚一点,newkey_out 是否在存储过程中标有“输出”关键字,是否为它选择了一个值?
    • 是的,它在输出时被标记。自从计划 ADO 和 LINQtoSQL 时代以来,这个存储过程就已经存在了。我最终在 proc 结束时执行了 SELECT newkey_out(基本获取数据集),并在 EF 中使用了标量输出类型。这修复了它,但我不喜欢它:( 我希望有一种方法可以按原样调用它。使用参数名称。我们在 DB 端有大量代码,命名约定是 @_Parameter_in 和 @_Parameter_out。 EF 不能使用名称。我会标记你的答案,因为我通过你的链接让它工作
    【解决方案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() 函数解决单行或值。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 2011-11-24
        相关资源
        最近更新 更多