【问题标题】:Enabling Multiple Active Result Sets using Dapper使用 Dapper 启用多个活动结果集
【发布时间】:2019-08-21 09:14:54
【问题描述】:

我正在将 Dapper 与 asp.net 核心一起使用,并且我正在尝试启用多个活动结果

有人设法使用 Dapper 启用 MARS 吗?

我尝试附加到连接"MultipleActiveResultSets=True",但没有任何效果。

Enabling Multiple Active Result Sets

我得到的错误是

InvalidOperationException:连接不支持 多个ActiveResultSets

【问题讨论】:

  • @MatthewEvans 谢谢,我已经检查了那个答案。不同之处在于,我使用的是记录所有请求和响应详细信息的中间件,而不是 foreach。我不确定 Task.Delay(1000) 是否是一个好的解决方案。
  • 你能让 MARS 工作吗,它与 Dapper 无关,但为什么它失败了,你为什么不能启用它,你有没有发现,你是使用 Sql Server 作为数据库还是别的东西

标签: c# asp.net-core dapper


【解决方案1】:

Dapper 与 MARS 的唯一轻微连接是使用重叠的异步 API 使用 ExecuteAsync 发出多个运行中操作时,并通过配置 Pipelined 告诉它你想要trueCommandDefinition。除此之外:Dapper 不关心 MARS。如果您在连接上启用它:它将被启用;如果你不这样做:它不会。没有 MARS 将无法工作的关键是:使用 unbuffered 查询 (Query<T>(...buffered: false)),然后在该查询 inside 发出额外的操作。但这通常可以通过简单地避免:不这样做。您也可以在您的连接字符串上启用 MARS,但坦率地说,我通常建议反对

所以:Dapper 没有与 MARS 相关的明确控制除了ExecuteAsync 启用Pipelined 的情况下。

【讨论】:

  • 感谢您的澄清,我有一个link,它很好地解释了相同的概念。我理解此功能的方式主要用于连接架构,以便在获取的每个结果单元上执行更多查询。另一方面,它与多个结果集无关,这是默认行为
【解决方案2】:

MultipleActiveResultSets=True 是一个 ADO.Net 配置,它与 Dapper 无关,它的目的是在单个实时连接上执行重叠批处理操作,查看link 了解更多信息。

如果您的目标是在一次执行中接收多个结果集,那么这与 MARS 无关并且默认启用。使用 Dapper 执行此操作需要使用 QueryMultiple 来获取 GridReader,这可以帮助获取多个结果集,请查看 Dapper Query Multiple。在普通的 ADO.Net 中,出于相同目的,您需要使用 DataReader.NextResult 连接架构,使用 Dataset 连接架构以获取多个结果集

【讨论】:

  • 注意:GridReader 用于在单个操作上查询多个连续结果集,与 MARS 完全正交;您可以使用其中一个,也可以不使用,或者两者都使用
  • @MarcGravell 如果查询 / proc 执行生成多个连续的结果集,那么要获取它,我们需要启用 MARS 和 QueryMultiple,除此之外还有什么用例。特别是因为多个结果可以有完全不同的模式,所以其他 API 都不适合
  • " 那么要获取它,我们需要启用 MARS" - 不,完全不正确,抱歉;这不是 MARS 的意思。 MARS 用于发出两个 overlapped 查询,即您发出查询 A,获取 1 行(例如 96 行),然后发出另一个查询/命令 B,然后查看 A 的第 2 行,等等 -这里的关键点:在现有命令仍在迭代时发出第二个命令
  • @MarcGravell 感谢您的澄清,这意味着,我们不需要为获取多个结果集做任何特别的事情,只需使用正确的 API,启用/禁用 MARS 没有任何作用。有什么好的例子可以回顾吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
相关资源
最近更新 更多