Dapper怎么调用存储过程 Dapper执行存储过程详解

畫卷琴夢
发布: 2025-12-14 18:33:07
原创
722人浏览过
Dapper调用存储过程需明确三点:指定CommandType.StoredProcedure、正确传参(匿名对象或DynamicParameters)、选用合适执行方法(Query/Execute/QueryMultiple);支持异步与事务,关键在细节准确。

dapper怎么调用存储过程 dapper执行存储过程详解

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 原生不支持从匿名对象读取 OUTPUTRETURN 参数,这时得用 DynamicParameters 类——它是 Dapper 提供的可变参数容器。

  • 每个 Add() 调用需明确指定参数名、值、DbTypeParameterDirection
  • 输出参数的值在执行后通过 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 分步读取。

站酷梦笔
站酷梦笔

国内知名设计社区站酷推出的AI插画生成工具

站酷梦笔 170
查看详情 站酷梦笔
  • 调用后得到一个 GridReader 对象
  • 每调一次 .Read<t>()</t> 就消费一个结果集,顺序必须和存储过程中 SELECT 的顺序一致
  • 支持不同泛型类型,比如 Read<user>()</user>Read<role>()</role>

示例:

using (var multi = conn.QueryMultiple("sp_GetUserAndRoles", 
    new { UserId = 123 }, 
    commandType: CommandType.StoredProcedure))
{
    var user = multi.Read<User>().FirstOrDefault();
    var roles = multi.Read<Role>().ToList();
}
登录后复制

异步调用与事务配合

Dapper 所有核心方法都有异步版本(QueryAsyncExecuteAsyncQueryMultipleAsync),适合高并发 Web 场景。

  • 异步调用时,输出参数仍可用 DynamicParameters,执行完再取值
  • 若需事务控制,把连接和事务对象一起传入(transaction 参数),存储过程会在同一事务上下文中运行
  • 注意:事务必须由你手动 BeginTransaction(),并负责 Commit()Rollback()

示例(事务中执行两个存储过程):

using (var conn = new SqlConnection(connStr))
{
    await conn.OpenAsync();
    using var tx = await conn.BeginTransactionAsync();

    try
    {
        await conn.ExecuteAsync("sp_CreateOrder", orderParams, tx, commandType: CommandType.StoredProcedure);
        await conn.ExecuteAsync("sp_SendNotification", notifyParams, tx, commandType: CommandType.StoredProcedure);
        await tx.CommitAsync();
    }
    catch
    {
        await tx.RollbackAsync();
        throw;
    }
}
登录后复制

基本上就这些。Dapper 调用存储过程不复杂但容易忽略细节——比如漏写 CommandType.StoredProcedure、混淆 OutputReturnValue、或多结果集读取顺序错乱。按场景选对方法,参数配准类型,基本不会踩坑。

以上就是Dapper怎么调用存储过程 Dapper执行存储过程详解的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号