2014-11-20 14 views
23

Sự khác biệt chính giữa hai phương pháp này là gì? Trên trang web msdn nó được giải thích như dưới đây nhưng tôi không hiểu nó.Sự khác biệt giữa SqlDataReader.Read và SqlDataReader.NextResult

Read Tiến hành SqlDataReader thành bản ghi tiếp theo. (Ghi đè DbDataReader.Đọc().)

NextResult Tiến hành đọc dữ liệu đến kết quả theo lô Transact-SQL tiếp theo. (Ghi đè dbDataReader.NextResult().)

Trả lời

35

Nếu câu lệnh/proc của bạn trả lại nhiều tập kết quả, Ví dụ, nếu bạn có hai câu lệnh select trong đối tượng Command, thì bạn sẽ lấy lại hai tập kết quả.

  • NextResult được sử dụng để di chuyển giữa các bộ kết quả.
  • Read được sử dụng để tiến lên phía trước trong hồ sơ của một tập hợp kết quả duy nhất.

Hãy xem xét ví dụ sau:

Nếu bạn có một proc mà cơ thể chính là như:

.... Proc start 

SELECT Name,Address FROM Table1 

SELECT ID,Department FROM Table2 

-- Proc End 

Thực thi các proc trên sẽ sản xuất hai bộ kết quả. Một cho Table1 hoặc câu lệnh chọn đầu tiên và câu lệnh khác cho tuyên bố select tiếp theo.

Theo mặc định, tập hợp kết quả đầu tiên sẽ có sẵn cho Read. Nếu bạn muốn chuyển sang tập kết quả thứ hai, bạn sẽ cần NextResult.

Xem: Retrieving Data Using a DataReader

Ví dụ Mã so với cùng link: Lấy Nhiều Tập Hợp Kết Quả sử dụng 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

Tôi không hiểu ý bạn với 2 câu lệnh 'select' trong một truy vấn. Nếu bạn có 2 câu lệnh 'select', điều này có nghĩa là bạn có 2 truy vấn ... EDIT: Ok, tôi nghĩ rằng bây giờ tôi đã hiểu. NextResult chuyển sang 'truy vấn' tiếp theo trong ví dụ của bạn. Điều này xảy ra chỉ khi bạn sử dụng thủ tục? – Ozkan

+1

@Ozkan, Bạn có thể thực hiện nhiều câu lệnh chọn trong một lệnh đơn như 'SELECT * FROM Table1; SELECT * FROM TABLE2;', được phân cách bởi ';' trong trường hợp của SQL, hoặc bạn có thể lưu trữ thủ tục với nhiều câu lệnh chọn. – Habib

+1

@Ozkan, để chỉnh sửa của bạn trong bình luận, không có bạn có thể nối hai truy vấn cũng như trong một lệnh. Tôi đã thêm một liên kết từ MSDN và ví dụ từ đó là tốt. – Habib

0

Không đúng một câu trả lời cho câu hỏi này, nhưng nếu bạn sử dụng phương pháp DataTable.Load để tiêu thụ dữ liệu từ người đọc thay vì Reader.Read lưu ý rằng sau khi phương thức Load đã hoàn thành, người đọc hiện được đặt ở đầu của tập kết quả tiếp theo, do đó bạn không nên gọi phương thức NextResult nếu không bạn sẽ bỏ qua resultset tiếp theo.

Một vòng lặp đơn giản trên Reader.HasRows xung quanh cuộc gọi DataTable.Load là tất cả những gì bạn cần để xử lý nhiều kết quả tiềm năng trong trường hợp này.

Các vấn đề liên quan