2010-10-01 3 views
9

Come gestire più ResultSet, ciascuno con più righe? La chiamata a NextResult() interrompe il ciclo while.Come gestire più ResultSet, ciascuno con più righe? IDataReader.NextResult() ending Read()

Alcuni dei miei SP restituiscono più ResultSet. Li sto gestendo con NextResult() ma quando lo faccio e il mio SP ha un solo ResultSet, vedo che il ciclo while con Read() termina lasciandomi solo con la prima riga.

Senza la chiamata a NextResult() ottengo tutte le righe per il primo ResultSet ma ovviamente il secondo e successivi ResultSet non vengono elaborati?

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

risposta

29

È necessario creare due cicli annidati.

  • Il ciclo esterno deve iterare set di risultati e dovrebbe avere NextResult alla fine
  • Il ciclo interno deve iterare su righe in un set di risultati e dovrebbe avere Read all'inizio.

Qualcosa di simile:

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

bello su Tomas. – learnerplates

+0

Questo è stato fantastico. Raramente ho incontrato raramente loop di do-while che ho dimenticato che esisteva e quindi non ho mai pensato di usarne uno fino a quando non lo avessi visto. Grazie! – KSwift87

+0

Punto perfetto per una struttura do/while – pimbrouwers