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 :

[SQL + VB.NET] Alléger mon code pour un accès plus rapide


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Miles Raymond
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 189
    Par défaut [SQL + VB.NET] Alléger mon code pour un accès plus rapide
    Bonjour !

    Je savais pas vraiment quel titre mettre. J'ai un outil qui va afficher dans une listbox la liste des quelques 4000 clients d'une boîte. En cliquant sur un cliant, j'afficherai toutes ses informations.

    J'ai une première requête qui sélectionne tout les champs de ma base client et rempli ma listbox. Ensuite, lorsque je clique sur un client, j'ai vais afficher les informations en utilisant le selectedIndex de ma listbox et en fouillant mon dataset (puisque les données y sont enregistrées). Seulement j'ai une fonction de recherche (pour le moment rudimentaire) qui, lorsqu'on l'exécute, fait un SELECT WHERE et affiche les résultats dans ma listbox. Jusque là, si y a des petits soucis de réactivités, c'est encore utilisable. Mais quand je clique sur "rétablir" pour ôter le filtre et remettre tous mes clients dans ma listbox, je refait un SELECT.

    Et c'est dans ce cas là que ça pose problème, puisqu'il m'arrive d'avoir une fenêtre "envoyer le rapport d'erreur" de Windows. Le programme ne plante pas, mais il est clairement instable. Comment alléger mon code pour éviter ce problème ?

    Le code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    'Je vérifie lors de la sélection des clients, si on applique un filtre ou si on charge simplement tous les clients
    If UBound(filtres) > 0 Then
                'Je vérifie si ma recherche est global ou sélective (ce n'est pas important, j'ai juste un système de recherche global ou on recherche une partie d'un mot dans tous les champs, ou un système de recherche par champ que je n'ai pas encore implanté)
                If filtres(UBound(filtres)) = False Then
                    'Là je sélectionne toutes les colonnes de ma table client afin de rechercher dans tous mes champs n'importe quel valeur entrée
                    DA1.SelectCommand = cmd1
                    DA1.SelectCommand.Connection = cn
                    DA1.SelectCommand.CommandText = "SELECT column_name FROM information_schema.columns where table_name='client' and (data_type='character' or data_type='text');"
                    DS1 = New DataSet("data")
                    DA1.Fill(DS1)
     
                    'Là je fais un select en générant une requête à partir des champs se trouvant dans ma base client
                    DA.SelectCommand = cmd
                    DA.SelectCommand.Connection = cn
                    DA.SelectCommand.CommandText = "SELECT * from client WHERE"
                    splitedFiltre = Split(filtres(0), " ")
                    For j = 0 To DS1.Tables(0).Rows.Count - 1
                        For i = 0 To UBound(splitedFiltre)
                            If i <> 0 Or j <> 0 Then DA.SelectCommand.CommandText = DA.SelectCommand.CommandText & " OR"
                            DA.SelectCommand.CommandText = DA.SelectCommand.CommandText & " UPPER(" & DS1.Tables(0).Rows.Item(j).ItemArray(0).ToString & ") LIKE"
                            DA.SelectCommand.CommandText = DA.SelectCommand.CommandText & " UPPER('%" & splitedFiltre(i) & "%')"
                        Next i
                    Next j
                    DA.SelectCommand.CommandText = DA.SelectCommand.CommandText & " ORDER BY nom;"
                    DS = New DataSet("data")
                    DA.Fill(DS)
                    If DS.Tables(0).Rows.Count = 0 Then
                        MsgBox("Votre recherche n'a retournée aucun résultat")
                        loadClients()
                        bt_retablir.Enabled = False
                    Else
                        Filtre.Close()
                        bt_retablir.Enabled = True
                    End If
                'Pour implémenter le système de filtre plus tard
                ElseIf filtres(UBound(filtres)) = True Then
                End If
            Else
                'La commande exécutée au démarrage de l'appli ou lorsqu'on annule un filtre. Un simple select de toute ma base
                DA.SelectCommand = cmd
                DA.SelectCommand.Connection = cn
                DA.SelectCommand.CommandText = "SELECT * from client WHERE nom <> '' ORDER BY nom;"
                DS = New DataSet("data")
                DA.Fill(DS)
                bt_retablir.Enabled = False
            End If
     
            lb_Clients.DataSource = DS.Tables(0)
            lb_Clients.DisplayMember = "Nom"

  2. #2
    Membre confirmé Avatar de Miles Raymond
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 189
    Par défaut
    Rebonjour !

    Bon pas de réponse, je vais un peu resseré mes problèmes / questions.

    1. J'aimerais savoir s'il est possible de rechercher des données à l'intérieur d'un dataset. J'ai lu qu'on pouvait par l'intermédiaire de la fonction MyDataSet.Rows.Find() on pouvait effectuer des recherches, mais j'ai bien du mal à l'implanté. Comment cette fonction fonctionne-t'elle ? Est-il possible de rechercher dans tous les champs de toutes mes lignes n'importe qu'elle chaîne de texte, comme je l'effectue plus haut en sql ?

    2. Je parviens à modifier les éléments de mon DataSet sans le recharger, meme chose pour la suppression. Je suppose, pour ce que j'ai lu, que l'ajout n'a rien de compliqué non plus. Seulement mon dataset récupère des données d'une requête sql triée par nom. Si j'ajoute un item en faisant Add() la nouvelle ligne va s'afficher en dernière position de mon dataset, donc à la fin de ma listbox ! J'ai un peu bidouillé les fonctions defaultview.sort et j'arrive à trier le dataset par nom. Seulement ça ne concerne que l'affichage, "physiquement" on a pas changé les valeurs de place. Comment trier les valeurs pour que les valeurs se changent de place ?

    Merci !

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    j'ai pas trop compris ce que tu as fait vu que j'ai jamais utilisé de dataset mais vu le but de ce que tu veux faire il y a des moyen de faire ca en instantanné
    pour remplir la listbox, tu affiche pas tout donc moi je ferais une requete qui ramene juste les nom par exemple

    une fonction de tri en mémoire, j'ai deja fait sur une table de 30000 lignes c'est instantané

    ensuite sur le clic sur un client, tu fais un nouvelle requete qui va chercher dans la base les infos de ce client, des nouveaux objets pour stocker ca
    et il faut chercher par une colonne qui est indexée dans la base ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre confirmé Avatar de Miles Raymond
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 189
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    j'ai pas trop compris ce que tu as fait vu que j'ai jamais utilisé de dataset mais vu le but de ce que tu veux faire il y a des moyen de faire ca en instantanné
    pour remplir la listbox, tu affiche pas tout donc moi je ferais une requete qui ramene juste les nom par exemple

    une fonction de tri en mémoire, j'ai deja fait sur une table de 30000 lignes c'est instantané

    ensuite sur le clic sur un client, tu fais un nouvelle requete qui va chercher dans la base les infos de ce client, des nouveaux objets pour stocker ca
    et il faut chercher par une colonne qui est indexée dans la base ...
    En fait, j'aurais surtout voulu éviter d'avoir besoin de refouiller ma base lorsque je séléectionne un client, dans la mesure ou il y a pas mal d'infos à glaner. J'aurais voulu pouvoir stocker mes infos, depuis ma base, dans des dataset au démarrage de mon appli (ça ne me pose pase de problème d'avoir besoin d'un peu de temps pour démarrer le programme) de manière a avoir un max de réactivité lors du travail dans l'application même. Ensuite mes requêtes d'UPDATE, INSERT, DELETE c'est une autre histoire, mais j'aimerais pouvoir limité mes requêtes SELECT au max lors de mon utilisation du programme.

    En fait pour toutes les requêtes SELECT, j'aimerais "simuler" mes requêtes sur des dataset. Donc en gros, le but serait de posséder un structure de DataSet contenant les tables de ma base et de jongler entre elle. Lors des modifs, je couple les requêtes de ma base avec les requêtes de modifs sur les dataset.

    C'est vrai que je me suis très mal expliqué. Mais en gros la question est là : est-ce que c'est faisable (gestion des datarelation entre les tables, select, etc.) et est-ce vraiment intéressant en matière de réactivité ? Pour infos j'aurais une base de 1000 clients actifs avec pour chacun d'entre eux entre 0 et 10 contacts, des informations de contrats contenant entre 1 et 20 articles et x interventions contenant le même nombre d'articles... Ce qui représente, lorsqu'on séléctionne un client, un nombre d'infos assez conséquent !

    Merci !

  5. #5
    Invité de passage
    Inscrit en
    Octobre 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 1
    Par défaut
    Moi je serais assez d'accord avec : sperot51, je vois pas trop l'intéret de tous stocker dans un DataSet, le temps de requetage sur ta base de donné sera de toute façon negligeable tu ne verra absolument pas la différence si ta base est en local.

    Mais si tu le veux vraiment faire ce choix rien ne t'en empèche, si ce n'est que tu va te refaire ton modèle SQL avec des DataRelation etc.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    1000 clients avec 10 contacts avec 20 articles et on va dire meme 100 interventions
    ca reste négligeable, y a des applis qui travaillent avec des bases de données de plus de 10Go !
    si tu fais des index, des Pk et des FK une requete pour connaitre toutes les interventions d'un client prendra quelques ms à mon avis

    mais il doit toutefois etre possible de stocker ca dans un dataset, par contre j'y connais rien en dataset, je préfère la gestion manuelle avec des datatables ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Intégrer une variable pour alléger mon code ?
    Par castelcerf dans le forum jQuery
    Réponses: 3
    Dernier message: 06/10/2010, 12h52
  2. aide pour alléger mon code simple mais long
    Par tuco_benedicto dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/03/2010, 20h52
  3. Réponses: 7
    Dernier message: 25/07/2007, 13h14
  4. [Macro Access] pb dans mon code pour lancer une macro Access
    Par Commodore dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/06/2007, 10h51
  5. [Tableaux] probleme avec mon code pour faire un parseur !
    Par Joe-La-Boule dans le forum Langage
    Réponses: 10
    Dernier message: 11/10/2006, 15h35

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