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

Posted

技术标签:

【中文标题】Database.SqlQuery 调用具有多个输出参数的存储过程【英文标题】:Database.SqlQuery calling stored procedure that has multiple output parameters 【发布时间】:2014-02-20 20:06:44 【问题描述】:

我有一个像下面这样的存储过程,它接受 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 方法。我能够将记录插入员工表中,但找不到如何访问我的两个输出参数。我知道我需要像下面这样使用。谁能告诉我必须是什么结果。根据 MSDN,它可以是一个以列名作为属性的类。但我的情况是,我们没有返回表的列,而是使用了两个输出参数,我需要知道如何访问这两个输出参数 @OEmployeeId 和 @OSalary。

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

public class Result

   // what properties I must give here       

【问题讨论】:

【参考方案1】:

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

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

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

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;

【讨论】:

非常感谢彼得·汉森。这解决了我的问题。我真的很难找到任何关于使用 EF Code First 调用具有输出参数的存储过程的帖子和博客。 非常感谢 Peter Hanson,我正在尝试这样做,但我忘记了查询中的“out”,非常感谢!

以上是关于Database.SqlQuery 调用具有多个输出参数的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何最小起订量实体框架 SqlQuery 调用

C# 中的 db.Database.SqlQuery() 使用问题

必须使用 dbcontext.Database.SqlQuery 声明标量变量“@custid”?

使用 `db.Database.SqlQuery<model>` 后如何清除参数

db.Database.SqlQuery 原始数据返回存储过程名称和参数

EF ef Database.SqlQuery 内部回滚到执行的存储过程