Dapper调用存储过程需明确三点:指定CommandType.StoredProcedure、正确传参(匿名对象或DynamicParameters)、选用合适执行方法(Query/Execute/QueryMultiple);支持异步与事务,关键在细节准确。

Dapper调用存储过程其实很直接,关键在于三点:指定 CommandType.StoredProcedure、传对参数类型、选对执行方法(Query / Execute / QueryMultiple)。它不封装 SQL Server 的复杂性,但把底层细节控制权交给你,所以写法清晰、性能好、不易出错。
基础调用:无参或仅输入参数
最常见场景,比如查用户列表或更新单条记录。Dapper 支持用匿名对象传参,简洁高效:
- 连接打开后,直接调用
Query<t>()</t>(查数据)或Execute()(增删改) - 必须显式指定
commandType: CommandType.StoredProcedure - 参数用匿名对象即可,字段名要和存储过程中定义的参数名完全一致(大小写不敏感,但建议保持一致)
示例:
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var users = conn.Query<User>("sp_GetUsersByStatus",
new { Status = 1 },
commandType: CommandType.StoredProcedure).ToList();
}登录后复制
带输出参数:必须用 DynamicParameters
Dapper 原生不支持从匿名对象读取 OUTPUT 或 RETURN 参数,这时得用 DynamicParameters 类——它是 Dapper 提供的可变参数容器。
- 每个
Add()调用需明确指定参数名、值、DbType、ParameterDirection - 输出参数的值在执行后通过
Get<t>()</t>方法提取 - 注意:
OUTPUT参数在调用前可不赋初值,但RETURN参数需设direction: ParameterDirection.ReturnValue
示例:
var dp = new DynamicParameters();
dp.Add("@UserId", 1001, DbType.Int32, ParameterDirection.Input);
dp.Add("@Msg", dbType: DbType.String, size: 200, direction: ParameterDirection.Output);
dp.Add("@ResultCode", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
conn.Execute("sp_UpdateUserWithLog", dp, commandType: CommandType.StoredProcedure);
string msg = dp.Get<string>("@Msg");
int code = dp.Get<int>("@ResultCode");登录后复制
返回多个结果集:用 QueryMultiple
一个存储过程里如果写了多条 SELECT(比如先查用户再查其角色),Dapper 不会自动合并,要用 QueryMultiple 分步读取。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~