2010-03-10 9 views
6

Es bastante fácil para mí leer a través de una pequeña SQL Server 2005 tabla como la siguiente:necesita iterar por las filas de tabla SQL, uno a la vez (tabla demasiado grande para usar adapter.Fill)

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

Desafortunadamente , este método parece cargar toda la tabla en la memoria, lo que simplemente no va a funcionar con las tablas gigantescas con las que estoy trabajando.

Me gustaría poder recorrer la tabla una fila a la vez, de modo que solo una fila deba estar en la memoria a la vez. Algo a lo largo de las líneas de:

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

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

un poco similar a la forma en que se puede utilizar StreamReader para hacer frente a una sola línea archivo de texto a la vez, en lugar de leerlo todo a la vez. ¿Alguien sabe de una manera de hacer esto con las filas de la tabla (o, si estoy ladrando el árbol equivocado, una solución alternativa)?

Respuesta

8

Simplemente use un SqlDataReader en su lugar.

+0

Gracias por la punta! Estaba bastante seguro de que habría una forma .NET nativa de hacer esto, pero es difícil buscar un concepto en Google. ¡Necesitaba un nombre de clase para comenzar mi investigación! – Brandon

14

Debe utilizar un 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

Como ha encerrado la conexión con una instrucción using, no es necesario cerrarla, se cerrará automáticamente. mira esto: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx –

+0

Lo sé, pero solía cerrar la conexión después de cada consulta. Es útil en aplicaciones web complejas, en las que desea utilizar una agrupación de conexiones para las solicitudes. – TcKs

+0

Sin embargo, en este ejemplo, "connection.Close()" de repuesto real. – TcKs

Cuestiones relacionadas