在 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);
<p>connection.Execute("GetUserCount", p, commandType: CommandType.StoredProcedure);</p><p>int returnValue = p.Get<int>("@return"); // 或 p.Get<int>(0) 如果未命名
// returnValue 现在是存储过程中 RETURN 的值(如 -1 或某个用户 ID)注意点与常见误区
不要用Query<t></t>或
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 是唯一可靠方式”这个核心,就不会漏掉返回值。
