Alternative légère en lecture seule à DataTable pour le stockage de données à partir de SqlDataReader?

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

  •  06-07-2019
  •  | 
  •  

Question

J'utilise SqlDataReader pour lire des données à partir de SQL Server. Cependant, je souhaite parfois mettre en mémoire cache mes données en tant qu’objet en lecture seule et léger, sans connexion . Je n'ai trouvé aucune option pour moi dans la BCL. Dois-je écrire ma propre implémentation de ce conteneur ou y en at-il d'autres disponibles?

Quelles sont les alternatives pour stocker les données de la base de données sous une forme légère? Pour moi, DataTable n'est pas du tout candidat.

EDIT:

Lorsque je sais quelles données je sélectionne, je peux facilement utiliser LINQ pour transformer mon lecteur en List<T> ou quelque chose du genre. Mais j'aimerais plutôt pouvoir mettre en cache des données dont je ne connais pas la structure.

Était-ce utile?

La solution

List<object[]>

semble à peu près aussi léger que possible.

Et si vous voulez plus de fonctionnalités qu’il offre (telles que les noms de colonnes, la prise en charge de la liaison de données, le tri, le filtrage), vous pouvez dériver / encapsuler et ajouter cette fonctionnalité.

Votre exigence est plutôt vague. Que veut dire léger? Qu'est-ce qui ne convient pas à DataTable? De quelles fonctionnalités de DataTable avez-vous besoin?

Autres conseils

Créez votre propre structure de données.

La BCL ne devrait pas être tout pour tout le monde. Il se compose de blocs de construction. La BCL contient les éléments nécessaires à la création de votre propre structure de données.

Si la BCL contenait des solutions à chaque problème, ce serait un foutoir. Toutes les fonctionnalités ne doivent pas nécessairement être disponibles & «Disponibles dans le commerce», sinon il ne vous resterait aucune valeur à ajouter en tant que programmeur.

Vous semblez avoir des exigences assez claires qui diffèrent de & "normal &"; les modes d'utilisation. Entre les ensembles de données et les ORM, la grande majorité des projets s’entendent très bien sans les fonctionnalités souhaitées.

Vous pouvez utiliser List<Dictionary<String, Object>>, où clé de dictionnaire est le nom de la colonne et valeur la valeur de la cellule.

Si vous avez plusieurs lignes, vous pouvez séparer les noms de colonne en List<String> et en valeurs List<List<Object>> (ou Array).

Le meilleur choix serait d’avoir un type représentant vos colonnes de données, puis de simplement construire une instance de cette classe pour chaque ligne, de renseigner ses propriétés sur les valeurs du lecteur et de stocker les instances dans un fichier List<YourClass> structure.

Quelque chose comme:

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);
    } 
} 

C’est essentiellement ce que fait tout ORM (mappeur relationnel objet) - lisez les données de la base de données en utilisant le moyen le plus rapide possible (DataReader) et construisez-y des objets .NET.

Marc

Utilisez ceci:

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

string[] MyArray = Variable1.ToArray();

C’est l’objet le plus léger et le plus efficace pour sauvegarder en mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top