实体框架 - 存储过程返回值

bug*_*ker 11 c# sql stored-procedures entity-framework

我试图获取存储过程的返回值.以下是此类存储过程的示例:

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

if @@rowcount = 0
    return 1    

return
Run Code Online (Sandbox Code Playgroud)

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

这是一个糟糕的例子,因为这是一个选择,所以我确定我能找到返回0行.但是,在插入,删除或其他调用中,我们需要此返回值来了解是否存在问题.我一直无法找到获得此返回值的方法.我可以得到输出值,我可以得到结果集,但没有返回值.

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

有没有人能够使用Entity Framework从存储过程中获取返回值?

谢谢您的帮助!

Ale*_*exT 6

我想对存储过程返回值的支持取决于Entity框架的版本.虽然直接返回值对我不起作用,但我设法使用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
Run Code Online (Sandbox Code Playgroud)

这是测试代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

SP returned -1
Output param 123
Run Code Online (Sandbox Code Playgroud)

正如你看到的直接返回值输出一些垃圾但OUTPUT参数有效!

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

希望这可以帮助


jru*_*ell 3

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

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

  • 添加到此: @@rowcount 将返回标量值,或者就此而言,任何选择 @value 将返回标量值。如果您已经有一个结果集,这将添加一个新的结果集。目前,4.0 不支持多个结果集,但带有 EF 的 Framework 4.5 将支持多个结果集。 (2认同)