Precisa fazer uma iteração através das linhas da tabela SQL, uma de cada vez (tabela muito grande para usar o adapter.Fill)

É fácil ler uma pequena tabela do SQL Server 2005 como esta:

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

Infelizmente, esse método parece carregar a tabela inteira na memory, o que simplesmente não funcionará com as tabelas gigantescas com as quais estou trabalhando.

Gostaria de poder percorrer a tabela uma linha de cada vez, de modo que apenas uma linha precisa estar na memory de uma só vez. Algo ao longo das linhas de:

 foreach (DataRow row in rowIteratorObject) { // do something using the row // current row goes out of scope and is no longer in memory } 

É semelhante à maneira como você pode usar o StreamReader para lidar com um arquivo de texto uma linha por vez, em vez de ler tudo de uma vez. Alguém sabe de uma maneira de fazer isso com as linhas da tabela (ou, se eu estou latindo na tree errada, uma solução alternativa)?

Você deve usar um 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(); } } 

Apenas use um SqlDataReader .