2010-10-01 32 views
9

Comment gérer plusieurs ResultSets, chacun avec plusieurs lignes? L'appel à NextResult() casse la boucle while.Comment gérer plusieurs ResultSets, chacun avec plusieurs lignes? IDataReader.NextResult() se termine Read()

Certains de mes SP renvoient plusieurs ResultSets. Je les manipule avec NextResult() mais quand je le fais et que mon SP n'a qu'un seul ResultSet, je vois la boucle while avec Read() finir de me laisser avec seulement la première Row.

Sans l'appel à NextResult() j'obtiens toutes les lignes pour le premier ResultSet mais bien sûr le ResultSet deuxième et suivant ne sont pas traités?

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 
         } 
        } 

Répondre

29

Vous devez créer deux boucles imbriquées.

  • La boucle extérieure doit effectuer une itération sur les ensembles de résultats et devrait avoir NextResult à la fin
  • La boucle interne doit effectuer une itération sur les lignes du jeu de résultats et devrait avoir Read au début.

Quelque chose comme:

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()) 
} 
+0

belle Tomas. – learnerplates

+0

C'était génial. Je rencontre si rarement des boucles de do-while que j'ai oublié qu'il existait même et donc jamais pensé à en utiliser un avant de voir cela. Je vous remercie! – KSwift87

+0

Point parfait pour une structure do/while – pimbrouwers