使用 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&lt;T&gt;() 方法可能比 Read&lt;T&gt;().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 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dapper.NET 中使用事务?

ElasticSearch--aggregations聚合分析

使用多结果集读取数据减少服务器往返,提高性能

在一次执行中返回多个 s-s-rS 报告实例

dapper.net 转载

Dapper.net 的奇怪超时问题