在 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.Int32,direction = 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);
ENDC# 中调用并捕获返回值:
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)
注意点与常见误区
- 不要用
Query或Execute的返回值——它们返回的是受影响行数或结果集数量,不是存储过程的 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 是唯一可靠方式”这个核心,就不会漏掉返回值。










