【问题标题】:How to handle multiple ResultSets, each with multiple Rows? IDataReader.NextResult() ending Read()如何处理多个结果集,每个结果集都有多个行? IDataReader.NextResult() 结束 Read()
【发布时间】:2011-04-19 22:07:56
【问题描述】:

如何处理多个结果集,每个结果集都有多个行? 对 NextResult() 的调用会中断 while 循环。

我的一些 SP 返回多个 ResultSet。我正在使用NextResult() 处理这些,但是当我这样做并且我的 SP 只有一个 ResultSet 时,我看到带有 Read() 的 while 循环完成后,我只剩下第一行。

如果不调用 NextResult(),我会得到第一个 ResultSet 的所有行,但当然不会处理第二个和后续 ResultSet?

using (IDataReader reader = storedProcedure.ExecuteReader(
    CommandBehavior.CloseConnection, parameterNames as string[], arguments))
{
    while (reader.Read())
    {
        ArrayList row = new ArrayList();
        for (int j = 0; j < reader.FieldCount; ++j)
        {
            object rowValue = reader.GetValue(j);

            row.Add(rowValue);
        }

        reader.NextResult();//next resultset, breaks out of the  while
    }
}

【问题讨论】:

    标签: c# stored-procedures datareader


    【解决方案1】:

    您需要创建两个嵌套循环。

    • 外层循环应该遍历结果集并且应该有NextResult在结尾
    • 内部循环应该遍历结果集中的行,并且应该以 Read 开头。

    类似:

    using (IDataReader reader = ...) { 
      // Process all result sets
      do {
        // Process all elements in the current result set
        while (reader.Read()) { 
          ArrayList row = new ArrayList(); 
          for (int j = 0; j < reader.FieldCount; ++j) { 
            object rowValue = reader.GetValue(j); 
            row.Add(rowValue); 
          } 
          // TODO: Do something with 'row'
        }
      } while (reader.NextResult())
    } 
    

    【讨论】:

    • 这很棒。我很少再遇到 do-while 循环,以至于我什至忘记了它的存在,因此在看到这个之前从未想过要使用它。谢谢!
    • do/while 结构的完美结合
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2011-06-17
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多