全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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)。

  • 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)。选型时优先考虑数据库兼容性、团队熟悉度和维护成本。


# mysql  # app  # ai  # sqlserver  # c#  # sql  # Object  # foreach  # select  # 字符串  # int  # 循环  # 值参数  # 对象  # table  # postgresql  # 数据库  # 第三方  # 单条  # 这是  # 适用于  # 它是  # 自定义  # 不支持  # 较小  # 先在  # 数据库中 


相关文章: 网页制作模板网站推荐,网页设计海报之类的素材哪里好?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何在建站之星绑定自定义域名?  建站之星导航菜单设置与功能模块配置全攻略  如何通过FTP空间快速搭建安全高效网站?  如何在七牛云存储上搭建网站并设置自定义域名?  Android自定义listview布局实现上拉加载下拉刷新功能  如何通过远程VPS快速搭建个人网站?  详解jQuery中基本的动画方法  广州建站公司哪家好?十大优质服务商推荐  详解jQuery停止动画——stop()方法的使用  建站之家VIP精选网站模板与SEO优化教程整合指南  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何零成本快速生成个人自助网站?  大连网站设计制作招聘信息,大连投诉网站有哪些?  ,交易猫的商品怎么发布到网站上去?  如何获取免费开源的自助建站系统源码?  建站之星下载版如何获取与安装?  香港服务器选型指南:免备案配置与高效建站方案解析  建站主机如何选?高性价比方案全解析  如何用IIS7快速搭建并优化网站站点?  如何用狗爹虚拟主机快速搭建网站?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  如何快速查询网址的建站时间与历史轨迹?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  实例解析Array和String方法  制作网页的网站有哪些,电脑上怎么做网页?  ,南京靠谱的征婚网站?  建站主机是否等同于虚拟主机?  网站制作价目表怎么做,珍爱网婚介费用多少?  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何高效利用200m空间完成建站?  微信小程序 input输入框控件详解及实例(多种示例)  如何通过VPS建站实现广告与增值服务盈利?  javascript中对象的定义、使用以及对象和原型链操作小结  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  如何高效配置IIS服务器搭建网站?  如何选择可靠的免备案建站服务器?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  广州商城建站系统开发成本与周期如何控制?  股票网站制作软件,网上股票怎么开户?  北京企业网站设计制作公司,北京铁路集团官方网站?  如何自定义建站之星模板颜色并下载新样式?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  定制建站模板如何实现SEO优化与智能系统配置?18字教程  ,购物网站怎么盈利呢?  广州营销型建站服务商推荐:技术优势与SEO优化解析  制作表格网站有哪些,线上表格怎么弄?  建站之星后台管理系统如何操作? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。