2009-09-02 73 views

Respuesta

47

Es posible. En .NET 2.0+, SqlDataReader hereda de DbDataReader, que implementa IEnumerable (no genérico). Esto significa que se puede utilizar LINQ:

List<string> list = (from IDataRecord r in dataReader 
        select (string)r["FieldName"] 
        ).ToList(); 

Dicho esto, el bucle todavía está allí, sino que queda oculta en Enumerable.Select, en lugar de ser explícita en el código.

+2

+1. Eliminé mis respuestas a favor de las tuyas. –

+0

Hay másters aquí. Buena respuesta. – Tarik

+0

Funciona como un campeón, gracias! – ristonj

4

Dado que cualquier implementación de IDataReader (SqlDataReader incluida) será un lector de solo reenvío por definición, no hay forma de hacerlo sin bucle. Incluso si hubiera un método de biblioteca de marcos para hacer esto, tendría que pasar por el lector, tal como lo haría.

8

No, ya que SqlDataReader es un sólo avance de sólo lectura corriente de las filas de una base de datos SQL Server, el flujo de filas se bucle a través ya sea de forma explícita en el código o escondido en un marco de implementación (por ejemplo, el método de DataTable Load)

Parece que usar una lista genérica y luego devolver la lista como una matriz sería una buena opción. Por ejemplo,

List<int> list = new List<int>(); 

using (SqlDataReader reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     list.Add(reader.GetInt32(0)); 
    }  
} 
return list.ToArray(); 

En respuesta a tu comentario, llamando ToArray() pueden ser aéreas, depende. ¿Necesita una matriz de objetos para trabajar o sería más útil una colección genérica (como List<T> o ReadOnlyCollection<T>)?

+0

¿Crees que el método TaArray() es solo más gastos generales? – user161433

0

Tienes que hacer bucles, pero hay proyectos que pueden hacerlo más simple. Además, trate de no usar ArrayList, use List en su lugar.

usted puede comprobación FluentAdo una: http://fluentado.codeplex.com

public IList<UserAccount> List() 
    { 
     var list = new FluentCommand<UserAccount>("SELECT ID, UserName, Password FROM UserAccount") 
      .SetMap(reader => new UserAccount 
      { 
       ID = reader.GetInt("ID"), 
       Password = reader.GetString("Password"), 
       UserName = reader.GetString("UserName"), 
      }) 
      .AsList(); 

     return list; 
    } 
1

Si usted lee su SqlDataAdapter en un DataTable:

DataTable dt as DataTable; 
dt.fill(data); 

continuación, puede utilizar algunos de los juguetes en System.Data.DataSetExtensions como se indica en la respuesta de Joel Muller a este question.

En utiliza un poco de LINQ, por lo que tendrá una red .Net 3.5 o superior.

3

Al parecer, desde que .NET 1.1 tenían SqlDataReaderthe following method:

int size; 
object[] data = new object[]{}; 
size = reader.GetValues(data); 

Este puebla data con los valores de la fila lector actual, asignando al tamaño del número de objetos que se pusieron en la matriz.

1

OP orignial solicitó Array, ArrayList o List. Puedes devolver Array también. Simplemente llame al método .ToArray() y asígnelo a una matriz previamente declarada. Las matrices son muy rápidas cuando se trata de enumerar cada elemento. Mucho más rápido que una lista si la lista tiene más de 1000 elementos. Puede regresar a Array, List o Dictionary.

ids_array = (from IDataRecord r in idReader 
select (string)r["ID"]).ToArray<string>(); 

Además, si está utilizando una búsqueda de claves, por ejemplo, usted podría considerar la creación de un objeto HashSet con tiene un excelente rendimiento de la búsqueda si simplemente está mirando una lista contra otro para determinar si existe una clave de elementos en el Objeto HashSet. ejemplo:

HashSet<string> hs = new HashSet<string>( 
(from IDataRecord r in idReader select (string)r["ID"]).AsEnumerable<string>()); 
Cuestiones relacionadas