Stockage de données provenant de requêtes sur base de données

Résolu
Dimidx Messages postés 8 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 9 mai 2014 - 8 mai 2014 à 17:12
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 9 mai 2014 à 13:19
Bonjour,
Je souhaite stocker des données provenant de requêtes MySql en mémoire.
Le but souhaité:
Avoir simplement un tableau de tableauX afin de pouvoir les retrouver par la suite.
Le principe:
Un nombre de tableaux contenant un nombre de lignes et de colonnes indéfinis et c'est bien là que j'ai un problème. Je suis nouveau en cSharp mais je trouve (je crois...) qu'il y a pas mal de limitations. Il faut m'arrêter si je dis des bêtises mais il me semble qu'il n'est pas possible de créer un tableau multi-dimensionnel sans spécifier sa taille! Du coup impossible de gérer dynamiquement les résultats des requêtes.
1ère idée:
Récupérer le nombre de ligne et de colonne de mon MySqlDataReader afin de définir la taille de mon tableau. Problème, il est possible de connaître le nombre de colonnes FieldCount de mon reader mais pas le nombre de lignes (A moin de passer deux fois intégralité des données mais questions optimisation bof bof).
On oublie l'idée.
2ème idée:
Définir le tableau pour 50 lignes et le nombre de colonne exact et le redimensionner le nombre de ligne à mesure si besoin. Problème, la fonction Resize des array ne gère pas les multi-dimensions.
On oublie l'idée.
3ème idée:
Je change de langage de programmation. :D Je sèche...

Il y a encore le problème du nombre de requête indéfinies.
1ère idée:
Si je stock dans un Array il y a le même problème que les points ci-dessus si ce n'est qu'il sera uni-dimensionnel donc Resize devrait marcher.
2ème idée:
Créer dynamiquement les Array mais encore une fois en cSharp, je crois qu'il est impossible de créer dynamiquement des variables (Indirection du nom genre php, C++, Windev).

Bref il doit y avoir une philosophie de langage que je ne comprends pas mais je ne vois pas du tout comment résoudre ce problème.

J'espère que quelqu'un pourra m'aider car après plusieurs heures de recherches et de tests, je commence à désespérer que ce soit faisable.

Meilleures salutations et merci d'avance.

6 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
8 mai 2014 à 17:43
Bonsoir,

Il y a les listes (List<T> et Dictionary<T,T>) par exemples qui te permettent d'éviter un tableau.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
8 mai 2014 à 17:53
Bonjour,

la philosophie de langage que tu ne comprends vient sans doute du fait que l'existence des tableaux dans C# n'est (à mon sens) qu'un héritage du passé.
Il existe plusieurs autres formes de collection bien plus puissantes, sans prédéfinition de taille:
List<T>
Ienumerable<T>
BindingList<T>

etc

Je te conseille aussi de lire les tutos sur LinqToSql.
0
Dimidx Messages postés 8 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 9 mai 2014
8 mai 2014 à 19:56
Je ne suis pas vieux :D (30ans) mais je ne pense pas que le concept d'array soit désuet surtout quand je vois avec quel facilité il est possible d'inter-agir avec dans d'autre langage et les difficultés (Déjà 6heures de recherche) que j'ai pour faire ce que je veux en csharp bien que la donnée soit relativement simple. Soit c'est définitivement trop révolutionnaire et je ne comprend rien soit c'est une faiblesse du langage de ne pas avoir creusé un peux plus les fonctions de base.
0
Dimidx Messages postés 8 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 9 mai 2014
8 mai 2014 à 17:58
Bonsoir et merci de cette réponse rapide.

Sa n'est pas très clair pour moi ces listes mais d'après ce que j'ai lu, je ne vois pas comment allouer dynamiquement un nombre aléatoire de colonnes (Toujours le problème d'indirection), par contre pour l'ajout de ligne c'est simple

En admettant créer un une liste de dictionnaire multi-dimensionnel, est ce possible de rechercher des index (1 pour la liste et 1 pour le dictionnaire) afin d'extraire une donnée précise sur 3 dimensions (Numéro de requête, colonne, ligne)?

Meilleures salutations
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
8 mai 2014 à 19:15
Alors un truc à la fois.
Pars du principe que je n'ai jamais à traiter de base de données et donc il y a sans doute des trous dans mon raisonnement.

Dans l'exemple suivant, j'ai une source de données énorme de 3 entrées sous forme de List
Je crée dynamiquement un Ienumerable qui ne prend que les prénoms:
            List<Contact> contacts = new List<Contact>();
            contacts.Add(new Contact { Naissance = DateTime.Parse("01/01/2000"), Nom = "Sors", Prenom = "Jean" });
            contacts.Add(new Contact { Naissance = DateTime.Parse("02/02/2000"), Nom = "Di", Prenom = "Alain" });
            contacts.Add(new Contact { Naissance = DateTime.Parse("03/03/2000"), Nom = "Zètofré", Prenom = "Mélanie" });

            var malisteDynamique = (from c in contacts
                                    select new
                                    {
                                        Prenom = c.Prenom
                                    });



Si tu préfères une List<T>, il suffit de rajouter .ToList() à la fin de la requête. J'ai tendance à le faire systématiquement pour éviter les problèmes liés à l'évaluation différée des requêtes.


Sinon tu peux regarder cette discussion.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Dimidx Messages postés 8 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 9 mai 2014
8 mai 2014 à 19:48
Bonsoir,

Merci pour cette réponse mais encore une fois, la syntaxe de ton exemple ne laisse pas de dynamisme possible sur le nombre d'éléments. Sur le contacts.add il y a du dynamisme mais sur les listes insérées (Contact) les valeurs sont codées en dur à la main (Naissance, Nom, ...). Je veux dire que si cette structure venait à changer, elle n'y à pas de possibilité de la construire sur quelque chose de dynamique exemple une autre liste. Pour résumer, (et surtout pour être plus clair) imagine que les valeurs dans ces listes soient une fois "nom, prenom, age", une fois "poid, taille, age, sexe" etc et que ceci est aléatoire. Il est donc impossible de le créer statiquement.
Pour bien faire il faudrait pouvoir créer des listes avec index imbriquées les une dans les autres.

Le concept est vraiment celui d'un tableau de tableaux bi-dimensionnel. Un tableau x/y dans une liste qui les index.

Exemple:
Tab[1]-------Tab[2]----------Tab[3]
nom;age-----taille;poids-----couleur;forme;taille
toto;28-------1.80;60--------rouge;rond;10
tata;30-------2.05;80
---------------1.60;58

et que je puisse récupérer Tab[2][1][3] = 1.60

L'idée est de reproduire des tables mysql mais dans une mémoire. Le tableau tri-dimensionnel n'est pas une solution car il impose que toutes les dimensions soient de même taille.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
8 mai 2014 à 20:21
je vois c'est pour ça qu'à la fin de mon dernier message je t'orientais vers une autre discussion, ou deux solutions ont été explorées.

Sinon tu peux aussi faire des listes de tableaux, des tableaux de classe (dynamique ou non) etc.

En s'y prenant bien (mais là je ne t'aiderais pas je n'ai pas mysql, ni meme sqlserveur), tu dois pouvoir faire une requête LinqToSql, retournant un var construit comme tu veux.
0
Dimidx Messages postés 8 Date d'inscription mercredi 7 mai 2014 Statut Membre Dernière intervention 9 mai 2014
9 mai 2014 à 13:15
Bonjour,

Merci pour vos conseils.

Le LINQ est une autre façon d'interroger une base de donnée avec l'avantage sur SQL d'être un langage commun. J'ai appris quelque chose mais je n'ai pas réglé mon problème.

La solution, je l'ai trouvée avec les "Data table" (De Windows.Data). Celles-ci sont faites pour enregistrer des tableaux de données en mémoire. Ces dernières associées à un dictionnaire de type <string, DataTable> mon permis de faire une association {nom -> Tableau de données} exactement ce que je cherchais.

Voici comment je procède:

1. Charger le résultat de la requête dans une DataTable tampon.
2. Ajouter au dictionnaire cette dernière avec un nom afin de la retrouver
3. Extraire les données comme suit: nomDuDictionnaire[nomIndex].Rows[numeroDeLigne][nomDeColonne]

Encore une fois merci beaucoup.

Meilleures salutations
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
9 mai 2014 à 13:19
Tant mieux si tu as trouvé, et désolé si je ne t'ai pas apporté la solution.
0
Rejoignez-nous