如何处理多个包含多行的结果集?使用IDataReader.NextResult()结束Read()函数。

18
如何处理多个包含多行的结果集?
调用NextResult()可以在多个结果集之间进行切换。然而,当存储过程只返回单个结果集时,使用NextResult()会导致while循环停止,并且只能读取第一行。
如果不调用NextResult(),则可以获取第一个结果集中的所有行,但是无法处理后续的结果集。
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
    }
}
1个回答

41

你需要创建两个嵌套的循环。

  • 外层循环应迭代结果集,并在末尾使用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循环,以至于我甚至忘记它的存在,因此在看到这个之前从未想过要使用它。谢谢! - KSwift87
do/while 结构是一个完美的情况 - pim

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