2014-11-20 10 views
23

Qual è la differenza principale tra questi due metodi? Sul sito Web msdn è spiegato come sotto ma non lo capisco.Differenza tra SqlDataReader.Read e SqlDataReader.NextResult

Read Anticipa il SqlDataReader al record successivo. (Override DbDataReader.Read().)

NextResult fa avanzare il lettore di dati al successivo risultato, quando si leggono i risultati di lotti istruzioni SQL. (Esegue l'override dbDataReader.NextResult()).

risposta

35

Se la vostra dichiarazione/proc sta tornando più set di risultati, ad esempio, se si hanno due select dichiarazioni in un'unica Command oggetto, allora si otterrà indietro di due set di risultati.

  • NextResult viene utilizzato per spostarsi tra i set di risultati.
  • Read si utilizza per andare avanti nei record di un singolo set di risultati.

consideri il seguente esempio:

Se si dispone di un proc il cui corpo principale è come:

.... Proc start 

SELECT Name,Address FROM Table1 

SELECT ID,Department FROM Table2 

-- Proc End 

L'esecuzione del proc sopra produrrebbe due set di risultati. Uno per Table1 o prima istruzione di selezione e altro per la successiva dichiarazione select.

Per impostazione predefinita, il primo set di risultati sarebbe disponibile per Read. Se vuoi passare al secondo set di risultati, avrai bisogno di NextResult.

Vedi: Retrieving Data Using a DataReader

Esempio Codice dallo stesso link: Recupero di più set di risultati utilizzando NextResult

static void RetrieveMultipleResults(SqlConnection connection) 
{ 
    using (connection) 
    { 
     SqlCommand command = new SqlCommand(
      "SELECT CategoryID, CategoryName FROM dbo.Categories;" + 
      "SELECT EmployeeID, LastName FROM dbo.Employees", 
      connection); 
     connection.Open(); 

     SqlDataReader reader = command.ExecuteReader(); 

     while (reader.HasRows) 
     { 
      Console.WriteLine("\t{0}\t{1}", reader.GetName(0), 
       reader.GetName(1)); 

      while (reader.Read()) 
      { 
       Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0), 
        reader.GetString(1)); 
      } 
      reader.NextResult(); 
     } 
    } 
} 
+0

Non capisco cosa intendi con 2 istruzioni 'select' in una query. Se hai 2 istruzioni 'select', questo significa che hai 2 query ... EDIT: Ok, penso di aver capito ora. NextResult passa alla successiva 'query' nel tuo esempio. Questo succede solo quando usi le procedure? – Ozkan

+1

@Ozkan, È possibile eseguire più istruzioni select in un singolo comando come "SELECT * FROM Table1; SELECT * FROM TABLE2;', separato da ';' in caso di SQL, oppure è possibile avere stored procedure con più istruzioni select. – Habib

+1

@Ozkan, per la modifica nel commento, non è possibile concatenare due query anche in un comando. Ho aggiunto un collegamento da MSDN e un esempio anche da lì. – Habib

0

Non strettamente una risposta a questa domanda, ma se si utilizza il metodo di DataTable.Load di consumare i dati dal lettore piuttosto che dal Reader. Si noti che, dopo che il metodo Load è stato completato, il lettore è ora posizionato all'inizio del set di risultati successivo, quindi non si dovrebbe chiamare il metodo NextResult altrimenti si salterà il set di risultati successivo.

Un semplice loop su Reader.HasRows attorno a una chiamata DataTable.Load è tutto ciò che è necessario per elaborare potenziali più set di risultati in questo scenario.