IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Optimisation chargement Formulaire raccordé sur BDD


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut Optimisation chargement Formulaire raccordé sur BDD
    Bonjour
    J’aimerais profiter de votre expérience pour progresser encore un peu dans mon application VB+SQLServer avec ce pb que je pense assez classique

    J’ai
    - une table parent « Ville » d’environ 40 000 lignes
    - une table enfant « Personne » d’environ 3000 lignes
    les 2 sont reliées par contrainte d’intégrité référentielle

    J’ai crée un Form Personne ayant pour source
    - 1 dataset DSPersonne
    - 1 dataset DSVille pour charger un combobox permettant de modifier/ajouter cette info à partir d’une liste

    Le pb est que ce Form est long à charger (env 6sec mais je n’ose imaginer ce que cela donnera sur une base de plus de 100 000 lignes)

    J’ai modifié la requête du DSPersonne pour n’en charger qu’une partie (basée sur le nom) mais cela ne me fait rien gagner de significatif au vu de la taille de la base Personne
    Le pb est lié au chargement complet de DSVille
    J’ai envisagé plusieurs solutions mais j’aimerais connaître celle qui est la plus utilisée/efficace
    - remplacer le Dataset Ville par un Data reader (je n’ai pas de modification à faire sur la table ville), mais je ne sais pas si je gagnerai beaucoup de temps
    - ne charger au démarrage que les villes liées aux personnes, mais dans ce cas pour un ajout/modif il faudra bien charger la table complète à un moment donné :
    -- en temps masqué ?
    -- sur un Form spécifique ajout/modif ?
    Par avance, merci
    Bertrand

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    le dataset est pratique pour les débutants, mais ne permet pas de grandes modifications

    avec un datareader qui ne fait que lire les lignes, on fait ensuite ce qu'on veut, de plus le traitement sera en général plus rapide que de remplir un dataset

    à partir de là, tu peux charger tes 2 tables sur un autre thread, avec par exemple ajout au fur et à mesure dans l'interface (toutes les 1000 lignes lues par exemple)
    ca fera une ouverture avec déjà quelques milliers de lignes visibles en moins d'une seconde
    (voir backgroundworker pour le multithreading)

    pour le stockage des données tu peux faire une classe et utiliser un system.collections.generic.dictionary(of type_cle, type_classe)

    un combobox avec 40k choix me parait aberrent sinon ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut
    Bonsoir Pol63 et merci de cette réponse rapide !
    Effectivement les Dataset sont beaucoup plus faciles à utiliser, c'est pourquoi je pensais dans un premier temps m'en servir et ne garder les Datareader que pour remplir les listes (sans modif) des Combobox
    Ce qui me rebute avec le "tout code", ce sont les km de lignes pour ne serait ce qu'ajouter un élément dans la BDD, la gestion de l'ordre des modif pour respecter les intégrités différentielles,... et ce pour chaque Form !!
    J'ai beau lire plein de bouquins là dessus, j'arrive pas à m'en faire une idée assez claire pour le taper sans le "recopier", j'en oublie donc toujours la moitié !

    Pour le backgroundworker , je ne connaissais pas, mais cela me semble une bonne piste à creuser : merci !

    Effectivement 40k dans un combobox, ça fait beaucoup mais
    - il y bcp de communes en France !
    - à l’utilisation je n'ai jamais ressenti de gêne (tout au moins sous Access) grâce à l'auto-complétion.
    Mais peut être serait ce une autre piste :
    - charger les villes correspondant au contact (donc env 3000)
    - puis pour la saisie ne charger que les villes qui commencent par xx
    mais il faudrait jongler sur les propriétés du Combobox, et là j'ai encore du travail
    De plus cette liste me sert avec plusieurs tables / Form donc la garder en mémoire n'est pas forcément stupide (sauf si multi-utilisateurs)

    Merci encore, j'ai de quoi creuser !
    J'avance tout doucement, mais j'avance :-)
    Bertrand

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    quand on code bien, le dataset fait peut etre plus de lignes de code que les datareader et autres command ^^
    par contre il faut faire du code générique, c'est sur que si tu tapes chaque requete ca peut commencer à faire
    enfin déjà il faut une classe d'accès aux données à laquelle tu ne donnes que la requete, ca évite de créer les objets connexion command et autres partout dans le code
    ou sinon des choses comme Entity Framework, je ne suis pas sur que c'est la panacée pour faire du multithreading progressif avec, mais c'est encore plus pratique et orienté objet que les datasets

    40k lignes en ram ce n'est pas génant du tout, et dans le combobox avec l'autocomplétion c'est vrai que ca va aussi
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut
    J'ai essayé le BackgroundWorker : .......... et ça ne marche pas !
    Je pense que le Combobox ayant été crée de façon graphique, il essaie dés le chargement du Form de se charger avec un dataset .. qui lui n'est pas encore chargé (BackgroundWorker), le combobox reste donc vide !!
    Il ne me reste plus qu'à passer par du code (datareader : ça je devrais savoir faire!) pour ne charger le combobox que lorsque le BackgroundWorker à fini sa tache !
    Je me suis déja fait des getdataset, getdatareader.. pour remplir des datagridview en lecture seule
    mais le mélange graphique/code me pose des pb et je suis complétement perdu
    je ne vois pas comment charger mon combobox en code en ayant conçu le Form de façon graphique

    En graphique le Combobox à 4 propriétés :
    - Source de données : VilleBindingSource
    - Afficher le membre : LibelleVille (table Ville)
    - Membre value : IDville (table Ville)
    - Valeur sélectionnée : IDville (de mon dataset Contact)

    En code, je n'en retrouve que 3
    - DataSource : mon datareader
    - DisplayMember :Libelleville provenant de mon datareader
    - ValueMember : ID venant de (ville ou contact) ??

    Ou alors créer un VilleBindingSource à partir de mon datareader ?

    je continue mes recherches pour éclaircir ça !
    Merci
    bertrand







    -> datareader ou dois je crée en code

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    Valeur sélectionnée c'est SelectedItem
    tu peux aussi passer par SelectedValue en mettant la valeur d'IdVille

    par contre dans datasource, tu ne peux pas mettre un reader, on met soit un dataset, soit un datatable, soit une collection (auquel cas il te faudrait une classe Ville)

    Le combobox quand on lui donne des instances de classes, on peut lui donner un displaymember et/ou valuemember aussi, il utilisera les propriétés dont on lui donne les noms
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Formulaire impossible sur relation plusieurs à plusieurs - BDD Musique
    Par moononuk dans le forum Modélisation
    Réponses: 5
    Dernier message: 06/11/2013, 15h01
  2. [WD16] Optimiser les opérations sur BDD lourde
    Par JustineJ dans le forum WinDev
    Réponses: 16
    Dernier message: 04/01/2012, 17h34
  3. [AC-2000] Conflit d'ouverture de formulaire sur bdd scindée
    Par gravier3000 dans le forum IHM
    Réponses: 3
    Dernier message: 28/10/2010, 16h52
  4. Réponses: 18
    Dernier message: 11/03/2008, 10h23
  5. [Débutant] Tester une connection sur bdd
    Par lando dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 03/09/2003, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo