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

How to retrieve stored procedure return value with Dapper

提问人:Matt W 提问时间:5/18/2017 最后编辑:marc_sMatt W 更新时间:11/17/2023 访问量:5352

问:

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

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

如何确保变量将包含从 或 行返回的值?returnCodeRETURN -11RETURN @@ERROR

sql-server t-sql dapper

评论


答:

1赞 Andy Sinclair 5/19/2017 #1

我建议你用它来返回存储过程中的值。此外,您应该在 dapper 调用中指定返回类型:SELECT

RETURN -11

成为

SELECT -11

而 Dapper 呼叫就变成了:

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

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

10赞 Matt W 5/19/2017 #2

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

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");

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

评论

0赞 empz 3/15/2019
不可能同时获得结果集和返回值,对吧?
0赞 Sethlans 5/28/2019
@MattW我尝试了这个解决方案,但它抛出了一个异常,因为_params中的参数比存储的参数多
0赞 Jez 5/5/2020
有效的 C# 语法如何?我只是收到一个错误“DynamicParameters 不包含”ProductID“的定义。new DynamicParameters{ @ProductID = prodId, @Name = name };
0赞 michibr81 11/17/2023 #3

由于我不被允许发表评论:

Matt Ws Answer 对我有用。通过运行连接。Query(...) 还有结果,例如标量或每个 SELECT 从存储过程中获取的任何其他内容。

我添加了不同的动态参数:

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