Dapper怎么获取存储过程的返回值 Dapper SP Return Value捕获

在 Dapper 中获取存储过程返回值,必须使用 DynamicParameters 显式添加 DbType.Int32、ParameterDirection.ReturnValue 类型的参数;执行后通过 Get 方法读取,RETURN 值仅限整型且表示执行状态。

在 Dapper 中调用存储过程并获取其返回值(Return Value),关键在于使用 DynamicParameters 并显式声明一个类型为 DbType.Int32、方向为 ParameterDirection.ReturnValue 的参数。Dapper 本身不自动捕获存储过程的整数返回码,必须手动配置。

添加 ReturnValue 参数到 DynamicParameters

存储过程的 RETURN 值(如 RETURN 5)不是结果集,也不是 OUTPUT 参数,而是独立的执行状态码。需通过 DynamicParameters 显式注册:

  • 创建 DynamicParameters 实例
  • Add 方法添加一个无名称(或任意名称,如 @return)的参数,dbType = DbType.Int32direction = ParameterDirection.ReturnValue
  • 执行完命令后,从该参数中读取 .Value

完整示例代码(SQL Server)

假设 SQL Server 存储过程如下:

CREATE PROCEDURE [dbo].[GetUserCount]
    @Status INT = 1
AS
BEGIN
    SELECT COUNT(*) FROM Users WHERE IsActive = @Status;
    RETURN ISNULL((SELECT TOP 1 Id FROM Users WHERE IsActive = @Status), -1);
END

C# 中调用并捕获返回值:

var p = new DynamicParameters();
p.Add("@Status", 1, DbType.Int32, ParameterDirection.Input);
p.Add("@return", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

connection.Execute("GetUserCount", p, commandType: CommandType.StoredProcedure);

int returnValue = p.Get("@return"); // 或 p.Get(0) 如果未命名 // returnValue 现在是存储过程中 RETURN 的值(如 -1 或某个用户 ID)

注意点与常见误区

  • 不要用 QueryExecute 的返回值——它们返回的是受影响行数或结果集数量,不是存储过程的 RETURN 值
  • 确保 commandType 明确设为 CommandType.StoredProcedure,否则参数方向可能被忽略
  • 若存储过程有多个 RETURN 语句,只取最后执行的那个;SQL Server 不支持多返回值
  • 如果想同时获取结果集和返回值,用 QueryMultiple 不适用——直接用 Execute + DynamicParameters 即可,返回值与结果集互不影响

替代方案:用 OUTPUT 参数更可控(推荐复杂场景)

如果需要返回多个值或非整型数据,建议改用 OUTPUT 参数代替 RETURN

  • RETURN 仅限 INT,且语义上应表示执行状态(如 0=成功,-1=错误)
  • OUTPUT 参数支持任意类型、多个值,更灵活,Dapper 同样通过 DynamicParameters 支持
  • 例如:p.Add("@ResultId", dbType: DbType.Int32, direction: ParameterDirection.Output)

基本上就这些。抓住“ReturnValue 必须显式声明 + DynamicParameters 是唯一可靠方式”这个核心,就不会漏掉返回值。