2010-03-10 9 views
6

Thật dễ dàng đủ cho tôi đọc qua một SQL Server nhỏ 2005 bảng như thế này:Cần phải lặp thông qua bảng hàng SQL, cùng một lúc (bảng quá lớn để sử dụng adapter.Fill)

string cmdText = "select * from myTable"; 
SqlDataAdapter adapter = new SqlDataAdapter(cmdText, connection); 
DataTable table = new DataTable(); 
adapter.Fill(table); 

Thật không may , phương pháp này xuất hiện để tải toàn bộ bảng vào bộ nhớ, mà chỉ đơn giản là sẽ không làm việc với các bảng khổng lồ tôi đang làm việc với.

Tôi muốn có thể lặp qua bảng một hàng tại một thời điểm, sao cho chỉ một hàng cần có trong bộ nhớ cùng một lúc. Một cái gì đó dọc theo dòng:

foreach (DataRow row in rowIteratorObject) 
{ 
    // do something using the row 

    // current row goes out of scope and is no longer in memory 
} 

Loại tương tự như cách bạn có thể sử dụng StreamReader để đối phó với một file văn bản một dòng cùng một lúc, thay vì đọc nó tất cả trong cùng một lúc. Có ai biết một cách để làm điều này với hàng bảng (hoặc, nếu tôi sủa lên cây sai, một giải pháp thay thế)?

Trả lời

8

Thay vào đó, chỉ cần sử dụng SqlDataReader.

+0

Thanks for the tip! Tôi khá chắc chắn rằng sẽ có một cách .NET nguyên bản để làm điều này, nhưng thật khó để tìm kiếm một khái niệm cho Google. Tôi cần một tên lớp để bắt đầu điều tra! – Brandon

14

Bạn nên sử dụng một DataReader:

using(var connection = new SqlConnection("my connection string")) { 
    using(var command = connection.CreateCommand()) { 
     command.CommandText = "SELECT Column1, Column2, Column3 FROM myTable"; 

     connection.Open(); 
     using(var reader = command.ExecuteReader()) { 
      var indexOfColumn1 = reader.GetOrdinal("Column1"); 
      var indexOfColumn2 = reader.GetOrdinal("Column2"); 
      var indexOfColumn3 = reader.GetOrdinal("Column3"); 

      while(reader.Read()) { 
       var value1 = reader.GetValue(indexOfColumn1); 
       var value2 = reader.GetValue(indexOfColumn2); 
       var value3 = reader.GetValue(indexOfColumn3); 

       // now, do something what you want 
      } 
     } 
     connection.Close(); 
    } 
} 
+2

Vì bạn đã đính kèm kết nối với tuyên bố sử dụng, không cần phải đóng nó, nó sẽ tự động đóng. kiểm tra này: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx –

+0

Tôi biết, nhưng tôi đã sử dụng để đóng kết nối sau mỗi truy vấn. Nó hữu ích trong các ứng dụng web phức tạp, nơi bạn muốn sử dụng một kết nối tổng hợp cho các yêu cầu. – TcKs

+0

Tuy nhiên, trong mẫu này là "connection.Close()" thực sự phụ tùng. – TcKs