新闻中心

Dapper如何批量更新数据 Dapper Bulk Update高效实现

2025-12-15
浏览次数:
返回列表
Dapper 本身不支持批量更新,需借助原生 SQL、表值参数(TVP)、临时表或第三方库(如 RepoDB、Dapper.FastCRUD)实现;推荐 TVP + JOIN 方式,避免 foreach 循环和字符串拼接。

dapper如何批量更新数据 dapper bulk update高效实现

Dapper 本身不内置批量更新(Bulk Update)功能,它是一个轻量级 ORM,专注于单条 SQL 执行和映射。要实现高效批量更新,需结合原生 SQL、表值参数(TVP)、临时表或第三方扩展库(如 Dapper.FastCRUD、Dapper.Contrib 或更主流的 SqlKata + SqlServer 配合 TVP)。核心思路是:避免循环执行单条 UPDATE,改用一次 SQL 操作更新多行。

使用表值参数(TVP)+ 原生 SQL(推荐,SQL Server)

这是最常用、性能好且可控性强的方式。先在 SQL Server 中创建用户定义表类型(UDT),再通过 DataTable 或自定义 IDataReader 传入多行数据,在 UPDATE 中 JOIN TVP 完成批量更新。

  • 在数据库中提前建好 TVP 类型,例如:CREATE TYPE dbo.UpdateUserTableType AS TABLE (Id INT, Name NVARCHAR(50), Email NVARCHAR(100));
  • C# 中构造 DataTable,列名/类型严格匹配 TVP;或用 Dapper.SqlMapper.Execute 配合 new SqlMapper.ICustomQueryParameter 实现高效传参
  • SQL 写法示例:UPDATE u SET u.Name = t.Name, u.Email = t.Email FROM Users u INNER JOIN @updates t ON u.Id = t.Id;

拼接动态 SQL(小批量、简单场景)

适用于更新数据量较小(比如 ≤ 100 条)、字段固定、且对 SQL 注入有严格校验的场景。用 StringBuilder 拼出 CASE WHEN 或 VALUES + JOIN 形式。

  • 例如用 UPDATE t SET col = CASE id WHEN 1 THEN 'a' WHEN 2 THEN 'b' END WHERE id IN (1,2)
  • 注意参数化:所有值必须通过 @p0, @p1... 参数传入,不可字符串拼接值
  • Dapper 支持匿名对象或 DynamicParameters,可配合 Dictionary 或 List 构建参数集合

借助成熟扩展库(省事但引入依赖)

如果项目允许引入第三方包,Dapper.FastCRUDRepoDB 提供了开箱即用的 BulkUpdate 方法(底层仍走 TVP 或 SqlBulkCopy)。

Blackink AI纹身生成 Blackink AI纹身生成

创建类似纹身的设计,生成独特纹身

Blackink AI纹身生成 80 查看详情 Blackink AI纹身生成
  • connection.BulkUpdate(users, batchSize: 1000); —— RepoDB 示例,支持实体类直接更新
  • Dapper.FastCRUD 要求实体有主键标记,调用 UpdateAsync(IEnumerable) 即可
  • 注意:这些库在非 SQL Server 环境(如 PostgreSQL、MySQL)行为可能受限,需查文档确认支持情况

避坑提醒:什么方式不推荐

以下做法看似简单,实际在生产环境应避免:

  • 用 foreach 循环调用 connection.Execute("UPDATE ...", item) —— N+1 查询,性能极差
  • 手动拼接 SQL 字符串并插入值(未参数化)—— SQL 注入高危
  • 用 INSERT INTO ... SELECT + MERGE 替代 UPDATE,逻辑复杂且易出错,除非真需要 upsert 语义

基本上就这些。真正高效的 Dapper 批量更新,关键不在“用哪个库”,而在于是否绕开了逐条执行、是否利用了数据库原生批量能力(如 TVP、MERGE、SqlBulkCopy)。选型时优先考虑数据库兼容性、团队熟悉度和维护成本。

以上就是Dapper如何批量更新数据 Dapper Bulk Update高效实现的详细内容,更多请关注其它相关文章!


# 相关文章  # 宜都市营销推广  # seo怎样做好seo  # 网站优化有哪些效益  # 北京SEO搜索优化专员薪资  # 湛江全套网站建设  # 护肤品广告营销号推广  # 东莞课程培训网站建设  # 兴义如何推广网站  # 鞍山绍兴网站推广  # 新媒体营销广告推广优点  # 自定义  # 中文网  # mysql  # 它是  # 适用于  # 这是  # 数据库查询  # 单条  # 如何使用  # 第三方  # c#  # sqlserver  # ai  # app 


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


相关推荐: QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  163邮箱登录密码 163邮箱忘记密码找回  UC浏览器网页版登录入口官网 电脑版网址入口  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  J*aScript map 方法中处理循环元素为空数组的策略  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  J*aScript中向JSON对象添加新属性的正确姿势  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  J*aScript 字符串标签转换:使用正则表达式高效替换  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  J*aScript:在map操作中高效处理空数组  顺丰国际快递查询 国际件官方查询入口  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  微信聊天记录怎么加密_微信聊天记录加密方法  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  Python Socket多播通信中指定源IP地址的实践指南  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  Pygame教程:解决用户输入与游戏状态更新不同步问题  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  千牛数据看板网页版_千牛数据看板网页版访问方法  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  Python getattr() 异常处理深度解析:避免程序意外退出  yy漫画网页版官方入口_yy漫画官网登录页面链接  抓大鹅无需下载版 抓大鹅秒玩版入口  J*aScript生成器_j*ascript异步迭代  Android Studio计算器C键功能异常排查与修复教程  如何将HTML表格多行数据保存到Google Sheets  J*a中实现Go语言select通道多路复用机制  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  《噬血代码2》新预告片发布 展示游戏剧情  新三国志曹操传110级星符试炼夏侯渊极难攻略  铃兰之剑为这和平的世界希里技能组及加点推荐  12306选座怎么选到商务座_12306商务座选择与配置说明 

搜索