讲师中心 微信公众号
AI工具推荐 视频效率加速

C# Dapper多结果集查询方法 C#如何使用QueryMultiple一次执行多条查询

秋静酱_1810

秋静酱_1810

发布时间:2026-02-12 08:03:09

|

440人浏览过

|

来源于php中文网

原创

必须用 using 包裹 QueryMultiple,因其返回的 GridReader 持有未关闭数据库连接,不及时释放易致连接池耗尽;且 Read() 必须严格按 SQL 结果集顺序调用,否则错位或抛异常。

c# dapper多结果集查询方法 c#如何使用querymultiple一次执行多条查询

QueryMultiple 为什么必须用 using 包裹

Dapper 的 QueryMultiple 返回的是 GridReader 对象,它底层持有一个未关闭的数据库连接。如果不显式释放,连接会一直占用直到 GC 回收(甚至可能不回收),极易触发连接池耗尽错误,比如 Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool.。

实操建议:

  • 必须用 using 语句包裹 QueryMultiple 调用,确保 GridReader 被及时 Dispose()
  • 不要把它赋值给类字段或长期持有;不能在 using 外访问 GridReader
  • 如果需异步执行,改用 QueryMultipleAsync 并配合 await using

如何正确读取多个结果集(Read 顺序不能错)

GridReader.Read<t>()</t> 是按 SQL 中查询语句出现顺序依次读取的,不是按类型自动匹配。一旦调用顺序与 SQL 结果集顺序不一致,后续读取会全部错位或抛出 InvalidOperationException: The IDataReader has been disposed.(因为内部指针已移到末尾)。

示例 SQL(两个结果集):

SELECT Id, Name FROM Users WHERE Active = 1; SELECT OrderId, Total FROM Orders WHERE UserId = @id;

对应 C# 代码必须严格按此顺序读取:

using var reader = connection.QueryMultiple(sql, new { id = 123 });
var users = reader.Read<User>().ToList();
var orders = reader.Read<Order>().ToList(); // 必须在 Read<User> 之后

常见错误:

C#
C#

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

下载
  • 先调 Read<order>()</order> 再 Read<user>()</user> → 第二个读取返回空集合
  • 漏掉某个 Read<t>()</t> 调用 → 后续结果集无法访问(GridReader 不支持跳过)
  • 对同一结果集重复调用 Read<t>()</t> → 第二次返回空(数据已读完)

参数传递和 SQL 拼接注意事项

QueryMultiple 的参数只绑定一次,作用于整个多语句 SQL 字符串。所有分号分隔的查询共享同一组参数,不能为每个子查询单独传参。

关键限制:

  • SQL 中所有查询语句必须使用相同参数名,例如都用 @id,不能一个用 @userId、另一个用 @uid
  • 不支持动态拼接不同参数的多语句(如根据条件决定是否追加第二个查询);需提前构造完整 SQL 字符串
  • SQL Server 允许用分号分隔;MySQL 需开启 Allow User Variables=true 且慎用多语句(默认禁用),PostgreSQL 不支持原生多结果集,需用 UNION ALL 或函数封装替代

安全建议:避免字符串拼接参数,始终用命名参数,防止注入。例如不要写 "SELECT * FROM Users WHERE Id = " + id。

性能与映射边界问题

QueryMultiple 本质是单次往返(round-trip)执行多个查询,比多次 Query 节省网络开销,但所有结果集会同时加载进内存。当任一结果集极大时,容易引发 OutOfMemoryException,尤其在 Web 应用中。

优化方向:

  • 对大数据量结果集,优先考虑分页或流式处理(但 GridReader 不支持流式,只能靠 SQL 限行)
  • 避免在单个 QueryMultiple 中混入高延迟查询(如带复杂 JOIN 的报表 + 快速查配置表),慢查询会拖累全部
  • 映射时若某结果集列名与目标类型属性不匹配,Dapper 默认忽略该列(不报错),容易静默丢数据;建议开启 Settings.UseAutoSelect = true 或手动检查 SqlMapper.GridReader 的列元数据

最易被忽略的一点:SQL Server 中,如果任意一个结果集为空(如 SELECT * FROM Table WHERE 1=0),Read<t>()</t> 仍会返回空集合,不会跳过或报错——这意味着你必须依赖业务逻辑判断“空是否合法”,而不是靠异常来发现查询异常。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4843

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

991

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1269

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6861

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3563

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6860

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9521

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1290

2024.04.29

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn