Database.SqlQuery 调用具有多个输出参数的存储过程



我有一个如下所示的存储过程,它接受 1 个输入参数(名称)并返回 2 个输出参数(员工 ID 和薪水)。我们的存储过程会将 Name 插入到员工表中,并返回员工 ID 和薪水。

CREATE PROCEDURE dbo.insertemployee
@iName varchar(500),
@OEmployeeId int OUTPUT,  
@OSalary Money OUTPUT

我们正在使用 EF 代码优先方法。我能够将记录插入员工表中,但找不到如何访问我的两个输出参数。我知道我需要像下面这样使用。谁能告诉我结果是什么。根据 MSDN,它可以是将列名作为属性的类。但我的情况是,我们不返回表的列,而是使用两个输出参数,我需要知道如何@OEmployeeId和@OSalary访问这两个输出参数。

context.Database.SqlQuery<Result>(" exec dbo.insertemployee....);
public class Result
{
   // what properties I must give here       
}

您尝试使用的方法仅适用于查询结果。它无法自动将输出参数的值放入新对象中。

您必须显式创建参数,并在存储过程运行后读取其值。

因此,如果您有如下所示的存储过程:

CREATE PROCEDURE dbo.insertemployee
(
    @iName varchar(500),
    @OEmployeeId int OUTPUT,  
    @OSalary Money OUTPUT
)
AS
BEGIN
    SELECT @OEmployeeId = 1337;
    SELECT @OSalary = 1000;
END

。您可以执行它并获取参数的结果,如下所示:

using (var ctx = new Context())
{
    var nameParam = new SqlParameter("iName", "TestName");
    var employeeIdParam = new SqlParameter("OEmployeeId", SqlDbType.Int) 
    { 
        Direction = System.Data.ParameterDirection.Output 
    };
    var salaryParam = new SqlParameter("OSalary", SqlDbType.Money) 
    { 
        Direction = System.Data.ParameterDirection.Output 
    };
    ctx.Database.ExecuteSqlCommand(
        "insertemployee @iName, @OEmployeeId out, @OSalary out", 
        nameParam, employeeIdParam, salaryParam);
    var employeeId = (int)employeeIdParam.Value;
    var salary = (decimal)salaryParam.Value;
}

最新更新