¿Alternativa ligera de solo lectura a DataTable para almacenar datos de SqlDataReader?

StackOverflow https://stackoverflow.com/questions/1811870

  •  06-07-2019
  •  | 
  •  

Pregunta

estoy usando Lector de datos SQL para leer datos de SQL Server.Sin embargo, a veces quiero almacenar en caché mis datos en la memoria como sólo lectura ligero sin conexión objeto.No pude encontrar ninguna opción para mí en la BCL.¿Necesito escribir mi propia implementación de dicho contenedor o hay alguna disponible?

¿Qué alternativas tengo para almacenar datos de la base de datos en forma ligera?Para mí Tabla de datos No es candidato en absoluto.

EDITAR:

Cuando sé qué datos estoy seleccionando, puedo usar LINQ fácilmente para transformar mi lector en List<T> o algo.Pero en lugar de eso, me gustaría poder almacenar en caché datos cuya estructura desconozco.

¿Fue útil?

Solución

List<object[]>

parece lo más liviano que puede obtener.

Y si desea más funcionalidad que ofrece (como nombres de columna, soporte de enlace de datos, clasificación, filtrado), puede derivar / encapsular y agregar esa funcionalidad.

Su requerimiento es bastante vago. ¿Qué significa peso ligero? ¿Qué tiene DataTable que no es adecuado? ¿Qué funcionalidad proporciona DataTable?

Otros consejos

Cree su propia estructura de datos.

El BCL no debería ser todo para todas las personas. Se compone de bloques de construcción. El BCL contiene los componentes básicos que necesita para crear su propia estructura de datos.

Si el BCL contuviera soluciones a cada problema, sería un desastre hinchado. No todas las funciones deberían estar disponibles & "; Listas para usar &"; De lo contrario, no quedaría ningún valor para usted como programador para agregar.

Parece que tiene requisitos bastante claros que son diferentes de " normal " patrones de uso. Entre DataSets y ORM, la gran mayoría de los proyectos se llevan bien sin la funcionalidad que requieren sus requisitos.

Puedes usar List<Dictionary<String, Object>>, donde la clave del diccionario es el nombre de la columna y el valor es el valor de la celda.

Si tiene muchas filas, puede separar los nombres de las columnas en List<String> y valores List<List<Object>> (o Array).

La mejor opción sería tener un tipo que represente sus columnas de datos, y luego simplemente construir una instancia de esa clase para cada fila, llenar sus propiedades con los valores del lector y almacenar las instancias en un List<YourClass> estructura.

Algo así como:

using(SqlDataReader rdr = sqlCommand.ExecuteReader())
{
    List<YourClass> resultList = new List<YourClass>();

    while(rdr.Read())
    {
         YourClass work = new YourClass();

         // set the properties        
         work.Property1 = rdr["Column1"].Value;
         .....
         work.PropertyN = rdr["ColumnN"].Value;

         resultList.Add(work);
    } 
} 

Eso es básicamente lo que hace cualquier ORM (mapeador relacional de objetos): leer los datos de la base de datos utilizando la forma más rápida posible (DataReader) y construir objetos .NET a partir de ella.

Marc

Use esto:

List<string> Variable1 = new List<string>();
//Do something with the generic

string[] MyArray = Variable1.ToArray();

Este es el obj imprescindible, ligero y eficiente para guardar en la memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top