使用Dapper启用多个活动结果集

5
我正在使用Dapper和asp.net core,我正在尝试启用多活动结果集。有人成功使用Dapper启用了MARS吗?
我尝试将"MultipleActiveResultSets=True"添加到连接中,但没有效果。
错误信息如下:

InvalidOperationException: 连接不支持多活动结果集

参考链接:启用多个活动结果集

有帮助吗?这是关于使用Dapper时出现“连接不支持MultipleActiveResultSets”的问题。 - Matt Evans
@MatthewEvans 谢谢,我已经查看了那个答案。不同之处在于,我使用的是一个记录所有请求和响应细节的中间件,而不是 foreach。我不确定 Task.Delay(1000) 是否是一个好的解决方案。 - Gerald Hughes
1
你能够让MARS工作吗?它与Dapper无关,但为什么会失败?为什么不能启用它?你发现了什么问题?你正在使用SQL Server作为数据库还是其他东西? - Mrinal Kamboj
2个回答

12
Dapper只与MARS略微相关,仅当使用重叠异步API通过在CommandDefinition上配置Pipelinedtrue来发出多个正在进行的操作时。其他情况下,Dapper不关心MARS。如果您在连接上启用了MARS,则它将被启用;如果您没有启用,则不会。唯一不能在没有MARS的情况下工作的是:使用非缓冲查询(Query<T>(...buffered: false))并在该查询中发出额外的操作。但通常可以通过简单地“不这样做”来避免这种情况。您也可以在连接字符串中启用MARS,但老实说,我通常建议不要那样做。
因此,Dapper没有明确与MARS相关的控件,除非涉及启用PipelinedExecuteAsync

感谢澄清,我已经找到了一个链接(https://dev59.com/Q3RB5IYBdhLWcg3wyqKo#511021),它很好地解释了相同的概念。我理解这个功能的方式主要是为了连接架构,以便在获取每个结果单元时执行更多的查询。另一方面,它与多个结果集无关,这是默认行为。 - Mrinal Kamboj

3
MultipleActiveResultSets=True 是一个ADO.Net配置,它与Dapper无关,它旨在在单个活动连接上执行重叠的批处理操作,了解更多信息,请参见链接
如果你的目标是在单个执行中收到多个结果集,那么这与MARS无关,并且默认情况下已启用。使用Dapper进行此操作需要使用QueryMultiple来获取GridReader,它可以帮助获取多个结果集,请参见Dapper Query Multiple。对于相同的目的,在普通的ADO.Net中,你需要使用DataReader.NextResult来获取连接体系结构和数据集用于断开连接体系结构的多个结果集的提取。

注意:GridReader 用于在单个操作中查询多个连续结果集,这与 MARS 完全无关;您可以使用其中任何一个、两个或都不使用。 - Marc Gravell
@MarcGravell 如果一个查询/proc执行产生多个连续的结果集,那么我们需要启用MARS和QueryMultiple来提取它,除此之外还有哪些用例。特别是因为多个结果可能具有完全不同的结构,所以其他API都不适用。 - Mrinal Kamboj
3
“然后要获取它,我们需要启用MARS”- 不好意思,完全错误;那不是MARS的意思。MARS用于发出两个重叠的查询,即您发出查询A,获取1行(例如96行),然后发出另一个查询/命令B,然后查看A的第2行,依此类推- 关键点在于:您在现有命令仍在迭代时发出第二个命令。 - Marc Gravell
@MarcGravell 感谢您的澄清,这意味着我们在获取多个结果集时不需要做任何特殊处理,只需使用正确的 API,启用/禁用 MARS 即可。是否有好的示例供参考? - Mrinal Kamboj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接