如何使用 Dapper 检索存储过程的返回值

Posted

技术标签:

【中文标题】如何使用 Dapper 检索存储过程的返回值【英文标题】:How to retrieve stored procedure return value with Dapper 【发布时间】:2017-05-18 10:55:31 【问题描述】:

我有一个这种形式的存储过程:

CREATE PROCEDURE AddProduct
    (@ProductID varchar(10),
     @Name  nvarchar(150)
    )
AS
    SET NOCOUNT ON;

    IF EXISTS (SELECT TOP 1 ProductID FROM Products 
               WHERE ProductID = @ProductID)
        RETURN -11
    ELSE
    BEGIN
        INSERT INTO Products ([AgentID], [Name])
        VALUES (@AgentID, @Name)

        RETURN @@ERROR
    END

我有这个 C# 来调用存储过程,但我似乎无法从中获得正确的值:

var returnCode = cn.Query(
    sql: "AddProduct",
    param: new  @ProductID = prodId, @Name = name ,
    commandType: CommandType.StoredProcedure);

如何确保returnCode 变量包含RETURN -11RETURN @@ERROR 行返回的值?

【问题讨论】:

【参考方案1】:

为了在 SQL 中使用 RETURN 语句,C# 变为...

var _params = new DynamicParameters @ProductID = prodId, @Name = name ;
_params.Add(
    name: "@RetVal",
    dbType: DbType.Int32,
    direction: ParameterDirection.ReturnValue
    );
var returnCode = cn.Execute(
    sql: "AddProduct",
    param: _params,
    commandType: CommandType.StoredProcedure);
return _params.Get<int>("@RetVal");

这不是我希望的实现,但它有效。

【讨论】:

不可能同时得到结果集和返回值吧? @MattW 我尝试了这个解决方案,但它引发了异常,因为 _params 中的参数比存储中的参数多 new DynamicParameters @ProductID = prodId, @Name = name ; 的有效 C# 语法如何?我只是得到一个错误'DynamicParameters 不包含'ProductID'的定义'。【参考方案2】:

我建议您使用SELECT 从您的存储过程中返回值。您还应该在 dapper 调用中指定返回类型:

RETURN -11

变成

SELECT -11

而简洁的调用变成:

var returnCode = cn.Query<int>(..

我已经多次实现了这种模式,它按预期工作。

【讨论】:

以上是关于如何使用 Dapper 检索存储过程的返回值的主要内容,如果未能解决你的问题,请参考以下文章

将 Dapper 与返回游标的 Oracle 存储过程一起使用

从 SQL 中的存储过程返回值 true 或 false,并在带有 dapper 的 asp core3 中使用它

Dapper 映射结果列表

如何在一个 SQL 查询中检索值并在存储过程中使用它?

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程案例演示

如何使sqlserver存储过程返回varchar