C#怎么使用Dapper执行批量更新_C#如何提升数据库性能【核心】

梦墨小哥_4233

梦墨小哥_4233

2026-03-28

639人浏览

原创

dapper 的 execute 不支持真正批量更新,正确做法是将逻辑下推至数据库端,如用表值参数(tvp)配合 join 更新;避免循环执行或依赖 dapper.contrib 等伪批量方案;注意连接复用、分批事务及索引优化。

批量更新不能直接用 dapper 的 execute 调用单条 sql 更新多行

dapper 本身不提供原生的批量更新 api,execute 方法每次只执行一条 sql 语句,哪怕你拼了 100 个 update 语句用分号隔开,在大多数数据库(如 sql server、postgresql)里也会被拒绝或只执行第一条。这不是 dapper 的限制,是底层 ado.net 和数据库协议决定的。

常见错误现象:SqlException: Incorrect syntax near ';'(SQL Server),或静默只更新第一行。

  • 正确做法是:把批量更新逻辑下推到数据库端,用 UPDATE ... FROM(SQL Server)、UPDATE ... JOIN(MySQL)、或 CTE + UPDATE(PostgreSQL)
  • 或者用临时表/表值参数(TVP)一次性传入数据集,再在 SQL 中关联更新
  • 避免在 C# 里循环调用 Execute,哪怕加了事务,I/O 和网络往返开销也极大

用表值参数(TVP)实现高效批量更新(SQL Server 场景)

这是 SQL Server 下最可控、性能最好的方式,核心是让数据库自己完成“匹配 + 更新”,C# 只负责传数据。

使用前提:数据库已建好对应类型的表值参数(例如 CREATE TYPE dbo.IdNameList AS TABLE (Id INT, Name NVARCHAR(50)))

  • 在 C# 中构造 DataTable,列名和类型必须与 TVP 完全一致(包括 nullability)
  • 用 new SqlMapper.IDynamicParameters() 添加参数,类型设为 SqlDbType.Structured,并指定 TypeName 为你的 TVP 名称
  • SQL 语句写成 UPDATE t SET t.Name = src.Name FROM Users t INNER JOIN @updates src ON t.Id = src.Id
  • 注意:TVP 不支持跨数据库引用,也不能在链接服务器查询中直接使用

示例片段:

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
var table = new DataTable();
table.Columns.Add("Id", typeof(int));
table.Columns.Add("Name", typeof(string));
foreach (var item in updates) {
    table.Rows.Add(item.Id, item.Name);
}
var p = new DynamicParameters();
p.Add("@updates", table.AsEnumerable(), DbType.Object, ParameterDirection.Input, null, null, "dbo.IdNameList");
connection.Execute("UPDATE t SET t.Name = src.Name FROM Users t INNER JOIN @updates src ON t.Id = src.Id", p);

用 Dapper.Contrib 或 Dapper.FastCRUD 替代?别盲目引入

Dapper.Contrib 的 UpdateAll 看似方便,但实际是循环调用单条 UPDATE,没有真正批量;Dapper.FastCRUD 支持批量更新,但依赖自动生成 SQL,对复杂条件(比如 where 子句含函数、多表关联)支持弱,且调试困难。

  • 如果你的场景只是“按主键更新若干字段”,且实体结构稳定,Dapper.FastCRUD 的 UpdateAsync 可用,但务必开启日志确认生成的 SQL 是你预期的
  • 如果更新逻辑含业务判断(如 “仅当状态为 Pending 时才更新”),必须手写 SQL —— 自动生成的 SQL 很难精准控制 WHERE 条件
  • 引入新包会增加部署体积和兼容性风险,.NET 6+ 项目要注意 Dapper.FastCRUD 对泛型约束和 nullable reference 的适配是否完整

性能关键点:别忽略连接复用、事务粒度和索引

批量更新快不快,一半看 SQL 写法,一半看执行环境。

  • 确保连接字符串开启了连接池(默认开启),但别在循环里反复 new SqlConnection —— 即使用了 using,频繁创建销毁连接仍拖慢整体吞吐
  • 批量更新建议显式包裹在 SqlTransaction 中,但事务范围不宜过大(比如 10 万行更新一个事务),否则锁表时间长、日志暴涨、失败回滚代价高;按 1000–5000 行分批更稳妥
  • WHERE 条件涉及的字段(如 Id)必须有索引,否则即使 SQL 正确,也会触发全表扫描,性能断崖下跌
  • SQL Server 上,若 TVP 数据量超 1 万行,考虑改用 SqlBulkCopy 先导入临时表,再用 UPDATE 关联,比 TVP 更快

最容易被忽略的是索引 —— 很多人测完“SQL 执行快”,上线后发现慢十倍,结果发现生产库缺了关键字段的索引。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2603

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6650

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6086

10

c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

1032

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

2991

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

885

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

2615

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

312

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

389

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习