使用 Dapper.NET 在一次往返中执行多个 SQL 语句
Posted
技术标签:
【中文标题】使用 Dapper.NET 在一次往返中执行多个 SQL 语句【英文标题】:Multiple SQL statements in one roundtrip using Dapper.NET 【发布时间】:2013-10-20 16:11:35 【问题描述】:ADO.NET 中有一个很好的功能,它允许您在一次往返中将多个 SQL 语句发送到数据库并接收所有语句的结果:
var command = new SqlCommand("SELECT count(*) FROM TableA; SELECT count(*) FROM TableB;", connection);
using(var reader = command.ExecuteReader())
reader.Read();
resultA = reader.GetInt32(0);
reader.NextResult();
reader.Read();
resultB = reader.GetInt32(0);
Dapper.NET 中是否有类似的功能?
【问题讨论】:
【参考方案1】:是的,Dapper QueryMultiple
扩展可以做到这一点:
string query = @"SELECT COUNT(*) FROM TABLEA;
SELECT COUNT(*) FROM TABLEB";
using (var multi = connection.QueryMultiple(query, null))
int countA = multi.Read<int>().Single();
int countB = multi.Read<int>().Single();
根据Marc Gravell,这是在单个批次中执行多个查询的理想方式。
注意:Dapper 创建者 Sam Saffron 已发布了 detailed explanation with code sample 使用 QueryMultiple
来完成此操作。
更新:我添加了 Marc 的重要评论
注意:从 1.5-ish(在 alpha 版本上稍早一点)有一个 ReadSingle() 方法可能比 读().Single()
【讨论】:
这里的东西很理想 注意:从 1.5-ish 开始(在 alpha 版本上稍早一些),有一个ReadSingle<T>()
方法可能比 Read<T>().Single()
更方便和高效
有趣。需要花点时间来测试这些新版本。还在1.42。它适用于 NET 4.0 吗?
@Shil 这样可以减少应用程序服务器和数据库服务器之间的网络调用次数。所以整体响应时间会更好。在这里,我在给定视图中需要至少 6 个结果集的地方工作。所以节省5个网络调用就很好了
这似乎在最新版本中被破坏了......我正在寻找修复。【参考方案2】:
var grid = connection.QueryMultiple("
SELECT COUNT(*) FROM TABLEA
SELECT COUNT(*) FROM TABLEB
SELECT COUNT(*) FROM TABLEC");
var lstResult = new List<int>();
var isNext = false;
do
var first2 = info.Read<int>().Single();
lstResult.Add(first2);
isNext=info.IsConsumed;
while (!isNext);
【讨论】:
谢谢!!我正在比较许多类似存储过程的结果。性能调整和不。 procs 可能会返回多个结果集。我无法得到所有这些。我在任何示例中都没有看到 IsConsumed 标志。这就是为什么我无法遍历它们并收集它们。感谢代码示例以上是关于使用 Dapper.NET 在一次往返中执行多个 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章