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

时间:2014-02-20 20:06:45

标签: entity-framework code-first

我有一个类似下面的存储过程,它接受1个输入参数(Name)并返回2个输出参数(EmployeeId和Salary)。我们的存储过程会将Name插入Employee表,并将EmployeeId和Salary返回给我们。

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

我们正在使用EF Code First方法。我能够将记录插入到employee表中,但无法找到如何访问我的两个输出参数。我知道我需要使用如下。任何人都可以告诉我一定是什么结果。根据MSDN,它可以是一个具有列名作为属性的类。但我的情况是我们没有返回我的表的列,但我们使用两个输出参数,我需要知道如何访问这两个输出参数@OEmployeeId和@OSalary。

context.Database.SqlQuery<Result>(" exec dbo.insertemployee....);

public class Result
{
   // what properties I must give here       
}

1 个答案:

答案 0 :(得分:25)

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

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

所以如果你有这样的存储过程:

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;
}