新闻中心

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

2025-12-14
浏览次数:
返回列表
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 分步读取。

挖错网 挖错网

一款支持文本、图片、视频纠错和AIGC检测的内容审核校对平台。

挖错网 185 查看详情 挖错网
  • 调用后得到一个 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执行存储过程详解的详细内容,更多请关注其它相关文章!


# 未来  # 郑州网站优化培训  # 物流运输seo优化软件  # seo优化外包直播  # 郑州抖音seo方式  # 网站建设和使用  # seo长沙县  # 建设400官方网站  # 天津网站推广的作用  # seo网站策划深度讲解  # 宿迁网站建设工程  # 都有  # app  # 新特性  # 游戏开发  # 过程中  # 发展趋势  # 三点  # 你在  # 有哪些  # 存储过程  # red  # nas  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  Golang如何使用const iota_Go iota常量计数器讲解  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  微信网页版官方入口教程 微信网页版网页版快速登录步骤  ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句  Mac怎么锁定备忘录_Mac备忘录加密设置教程  新三国志曹操传110级星符试炼夏侯渊极难攻略  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  b站如何看历史记录_b站观看历史找回方法  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  汽水音乐在线版入口_汽水音乐网页播放手册  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  动漫花园资源网使用步骤_动漫花园资源网下载流程  Lar*el递归关系中排除子孙节点的策略  韩小圈电脑版在线入口_网页版免费登录地址  C++如何解决segmentation fault_C++段错误调试与原因分析  《GTA6》开发画面疑似泄露!这次可不是AI了  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  抖音网页版怎么|直播|_抖音网页版开播操作指南  百度网盘网页版入口 百度网盘网页版官方登录网址  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  R星幕后开发视频泄露 包含《GTA6》等多款大作  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  Android Studio计算器C键功能异常排查与修复教程  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  小米14应用无法联网原因分析_小米14网络权限修复  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  j*a toString()的覆盖  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  Angular中父组件异步更新子组件复选框状态的实践指南  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  4399免费游戏网址入口 4399小游戏免费入口点开即玩  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  铁路12306的积分有效期是多久_铁路12306积分有效期说明  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  EMS快递官网app_中国邮政速递物流手机客户端  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  VS Code远程开发时如何处理文件权限问题 

搜索