【问题标题】:difference between NextResult and MARSNextResult 和 MARS 的区别
【发布时间】:2026-02-01 08:40:01
【问题描述】:

using .NextResultMultiple 活动结果集有什么区别?

sqlReader.NextResult();

while (sqlReader.Read())
{
    MessageBox.Show("From third SQL - " + 
                    sqlReader.GetValue(0) + " - " + 
                    sqlReader.GetValue(1));
}

火星

private static string GetConnectionString()
{
    // To avoid storing the connection string in your code,
    // you can retrive it from a configuration file.
    return "Data Source=(local);Integrated Security=SSPI;" + 
           "Initial Catalog=AdventureWorks;MultipleActiveResultSets=True";
}

【问题讨论】:

  • 对于 Damien 所写的内容,我要补充一点,MARS 可能很少使用,因为它是通往 SELECT N+1 反模式的道路。最后,如果第一个结果集很小,您可以在集合中读取它,然后执行第二个查询,而如果它太大,则执行 SELECT N+1 会杀死您的 db。所以 MARS 的用例很少。

标签: c# ado.net sql-server-mars


【解决方案1】:

他们几乎是对立的。

使用.NextResult,一段代码按顺序使用多个结果集。它通过调用.Read 依次处理(尽可能多地)每个结果集,然后当它不再想要处理该结果集时,它调用.NextResult 移动到下一个结果集。一旦您调用了.NextResult,就无法继续使用之前的结果集。

所有这些结果集都必须作为原始查询的一部分被请求,以生成DataReader。 (作为单独的SELECT 语句,或调用包含此类调用的存储过程,或两者的组合)

使用MARS,当您通过DataReader 使用结果集时,您可以在同一连接上提交一个单独的 查询,以生成一个新的、单独的DataReader。两个阅读器可以并行访问。

【讨论】:

  • +1 但它们并不相反...它们可能是正交的,即使使用 MARS,您甚至可以使用多个结果集,每个 DataReader
  • @xanatos - 我试图决定用什么词来描述它们最好。您可能是对的,正交更合适。