12

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

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

if @@rowcount = 0
    return 1    

return

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

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

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

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

谢谢您的帮助!

4

5 回答 5

6

我猜对存储过程返回值的支持取决于实体框架的版本。虽然直接返回值对我不起作用,但我设法使用 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 参数有效!

本文提供有关从 SP 返回值的两种方式的一般信息

希望这可以帮助

于 2014-09-13T06:11:14.207 回答
3

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

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

于 2012-04-26T19:30:14.510 回答
3

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

从存储过程中获取返回值

于 2013-02-06T17:59:19.653 回答
0

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

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

        int firstId = Context.Database.SqlQuery<int>("[dbo].GetFirstId").FirstOrDefault();
于 2017-10-26T09:51:36.320 回答
-2

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

选择
    姓名,
    已启用
从
    dbo.something
在哪里
    ID = @ID

如果@@rowcount = 0
    返回'',0
于 2012-04-26T19:30:39.050 回答