【问题标题】:Entity Framework - stored procedure return value实体框架 - 存储过程返回值
【发布时间】:2012-05-07 13:25:33
【问题描述】:

我正在尝试获取存储过程的返回值。以下是此类存储过程的示例:

select
    Name,
    IsEnabled
from
    dbo.something
where
    ID = @ID

if @@rowcount = 0
    return 1    

return

这是一个简单的选择。如果找到 0 行,我的结果集将为空,但我仍然会有一个返回值。

这是一个不好的例子,因为这是一个选择,所以如果返回 0 行,我肯定可以找到。但是,在 Insert、delete 或其他调用中,我们需要此返回值来了解是否存在问题。我一直无法找到获取此返回值的方法。我可以得到输出值,我可以得到结果集,但是没有返回值。

如果我手动调用 SQL,或者即使我使用实体框架运行SqlCommand,我也可以获得返回值,但这不是我想要做的。

有没有人能够使用实体框架从存储过程中获取返回值?

感谢您的帮助!

【问题讨论】:

  • Entity Framework 是一个 ORM,并不打算完全替换您的应用程序对数据库的所有调用。
  • 如果我手动调用 SQL,或者即使我使用实体框架运行 SQLCommand,我也可以获得返回值 - 这就是你的答案。
  • @Lamak - 哎呀我的错误,我看到它低于 50% 并假设最坏。

标签: c# sql entity-framework stored-procedures


【解决方案1】:

没有。 Entity Framework 没有丰富的存储过程支持,因为它是 ORM,而不是 SQL 替代品。

正如您已经发现的那样,如果您需要使用存储过程的不太常见(更高级?)的功能,则必须使用良好的老式 ADO.NET。

【讨论】:

  • 补充:@@rowcount 将返回一个标量值,或者就此而言,任何选择 @value 都将返回一个标量值。如果您已经有一个结果集,这将添加一个新的结果集。目前,4.0 不支持多个结果集,但带有 EF 的 Framework 4.5 将支持多个结果集。
【解决方案2】:

为了在 EF 中得到感兴趣的结果,你应该返回一个相同的结构(不是 1 和 Name,IsEnabled) 在此查询中,您应该在 if 条件中返回 '',0 而不是 1:

选择 姓名, 已启用 从 dbo.something 在哪里 ID = @ID 如果@@rowcount = 0 返回'',0

【讨论】:

  • 这和问题有关系吗?
【解决方案3】:

我已经能够使用 Entity Framework 5(但我认为它适用于版本 4.x)使用​​代码优先方法获取返回值(以及输出和输入参数)。从您的帖子中,我看不到您使用的是什么版本的 EF 以及您如何进行映射;如果您考虑在这里使用代码优先的方法,您可以找到我的帖子和解决方案:

Get return value from stored procedure

【讨论】:

    【解决方案4】:

    我猜对存储过程返回值的支持取决于实体框架的版本。虽然直接返回值对我不起作用,但我设法使用 OUTPUT 存储过程参数获取值。示例:

    USE [YOUR_DB_NAME]
    GO
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE [dbo].[TestReturnValue]
        @InputValue int = 0,
        @Result int OUTPUT
    AS
    BEGIN
        SET NOCOUNT ON;
        SELECT @Result  = @InputValue
        RETURN(@InputValue);
    END
    

    这是测试代码:

    void TestReturnValue()
    {
        using (var db = new YourDBContext())
        {
            var result = new System.Data.Objects.ObjectParameter("Result", 0);
            Console.WriteLine("SP returned {0}", db.TestReturnValue(123, result));
            Console.WriteLine("Output param {0}", result.Value);
        }
    }
    

    这是输出:

    SP returned -1
    Output param 123
    

    如您所见,直接返回值输出一些垃圾,但 OUTPUT 参数有效!

    This article provides general info on two ways of returning values from SP

    希望对你有帮助

    【讨论】:

      【解决方案5】:

      必须使用“Context.Database.SqlQuery”,并指定存储过程的输出类型

              var spReturnVaue = Context.Database.SqlQuery<Type>("[schema].YourSp").FirstOrDefault();
      
              int firstId = Context.Database.SqlQuery<int>("[dbo].GetFirstId").FirstOrDefault();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多