在 Dapper 中获取存储过程返回值,必须使用 DynamicParameters 显式添加 DbType.Int32、ParameterDirection.ReturnValue 类型的参数;执行后通过 Get 方法读取,RETURN 值仅限整型且表示执行状态。
在 Dapper 中调用存储过程并获取其返回值(Return Value),关键在于使用 DynamicParameters 并显式声明一个类型为 DbType.Int32、方向为 ParameterDirection.ReturnValue 的参数。Dapper 本身不自动捕获存储过程的整数返回码,必须手动配置。
存储过程的 RETURN 值(如 RETURN 5)不是结果集,也不是 OUTPUT 参数,而是独立的执行状态码。需通过 DynamicParameters 显式注册:
DynamicParameters 实例Add 方法添加一个无名称(或任意名称,如 @return)的参数,dbType = DbType.Int32,direction = ParameterDirection.ReturnValue
.Value
假设 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,否则参数方向可能被忽略QueryMultiple 不适用——直接用 Execute + DynamicParameters 即可,返回值与结果集互不影响如果需要返回多个值或非整型数据,建议改用 OUTPUT 参数代替 RETURN:
RETURN 仅限 INT,且语义上应表示执行状态(如 0=成功,-1=错误)OUTPUT 参数支持任意类型、多个值,更灵活,Dapper 同样通过 DynamicParameters 支持p.Add("@ResultId", dbType: DbType.Int32, direction: ParameterDirection.Output)
基本上就这些。抓住“ReturnValue 必须显式声明 + DynamicParameters 是唯一可靠方式”这个核心,就不会漏掉返回值。