2014-11-20 10 views
23

Jaka jest główna różnica między tymi dwoma metodami? Na stronie msdn wyjaśniono to jak poniżej, ale nie rozumiem tego.Różnica między SqlDataReader.Read i SqlDataReader.NextResult

Read Powoduje przejście instrukcji SqlDataReader do następnego rekordu. (Zastępuje DbDataReader.Read()).

NextResult Advances czytnika danych do kolejnego rezultacie, kiedy odczyt wyników partii Transact-SQL. (Zastępuje dbDataReader.NextResult().)

Odpowiedz

35

Jeśli twoja instrukcja/proc zwraca wiele zestawów wyników, Na przykład, jeśli masz dwie instrukcje select w pojedynczym obiekcie, otrzymasz dwa zestawy wyników.

  • służy do przemieszczania się między zestawami wyników.
  • Read służy do przechodzenia do przodu w zapisach pojedynczego zestawu wyników.

Rozważmy następujący przykład:

Jeśli masz proc którego głównym ciało jest jak:

.... Proc start 

SELECT Name,Address FROM Table1 

SELECT ID,Department FROM Table2 

-- Proc End 

wykonanie powyższej proc przyniosłoby dwa zestawy wyników. Jedna dla Table1 lub pierwsza instrukcja select i inna dla następnej instrukcji select. Domyślnie pierwszy zestaw wyników byłby dostępny dla Read. Jeśli chcesz przejść do drugiego zestawu wyników, będziesz potrzebować NextResult.

zobacz: Retrieving Data Using a DataReader

Przykład Kod z tego samego link: Odzyskiwanie wiele zestawów wyników wykorzystujące 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

Nie rozumiem, co masz na myśli, używając 2 instrukcji "select" w jednym zapytaniu. Jeśli masz 2 'select' wypowiedzi, oznacza to, że masz 2 pytania ... EDIT: Ok, myślę, że rozumiem teraz. NextResult przenosi się do następnego "zapytania" w twoim przykładzie. Zdarza się to tylko podczas korzystania z procedur? – Ozkan

+1

@Ozkan, Możesz wykonać wiele instrukcji SELECT w jednym poleceniu, jak 'SELECT * FROM Table1; SELECT * FROM TABLE2;', oddzielone ';' w przypadku SQL, lub możesz mieć procedurę składowaną z wieloma instrukcjami select. – Habib

+1

@Ozkan, do edycji w komentarzu, nie można łączyć dwóch zapytań w komendzie. Dodałem też link z MSDN i przykład z tamtego miejsca. – Habib

0

Nie ściśle odpowiedź na to pytanie, ale jeśli użyć metody DataTable.Load konsumować dane od czytnika, a nie od Czytnika. Zapamiętaj, że po zakończeniu metody Load, czytnik jest teraz umieszczony na początku następnego zestawu wyników, więc nie powinieneś wywoływać metody NextResult, w przeciwnym razie pominiesz następny zestaw wyników.

Prosta pętla w Read.HasRows wokół DataTable.Load call to wszystko, czego potrzebujesz do przetworzenia potencjalnych zestawów wyników w tym scenariuszu.