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

本文关键字:返回值 存储过程 框架 实体 | 更新日期: 2023-09-27 18:32:18

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

select
    Name,
    IsEnabled
from
    dbo.something
where
    ID = @ID
if @@rowcount = 0
    return 1    
return

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

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

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

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

感谢您的帮助!

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

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

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

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

希望这有帮助

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

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

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

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

基于Hadi Salehy的回答,我编写了这段代码并为我工作。

我的 SP

CREATE PROCEDURE [schema].[ProcedureName]
@param1 int,
@param2 varchar(20),
@param3 varchar(50)
AS
UPDATE Table1
SET Field2 = @param2, Fiedl3 = @param3
WHERE (Field1 = @param1)
SELECT @@ROWCOUNT;

我的 C# 代码。

int quantity = await _context.Database.ExecuteSqlRawAsync("[schema].[ProcedureName] {0}, {1}, {2}", myModel.Param1, myModel.Param2, myModel.Param3);

var parms = new List<SqlParameter>
{
    new SqlParameter { ParameterName = "@Data", Value = date},
    new SqlParameter { 
        ParameterName = "@returnValue", 
        Value = -123, 
        SqlDbType = System.Data.SqlDbType.Int, 
        Direction = System.Data.ParameterDirection.Output
    }
};
var sql = "EXEC @returnValue = db.dbo.spDoSomething @Data;";
var retProc = await _context.Database.ExecuteSqlRawAsync(sql, parms.ToArray());
var returnValue = (int)parms[1].Value;

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

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