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

来源:这里教程网 时间:2026-02-21 17:36:32 作者:

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

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

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 是唯一可靠方式”这个核心,就不会漏掉返回值。

相关推荐

热文推荐