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 :

Récupération dans base SQL


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut Récupération dans base SQL
    Bonjour à tous,

    Lors de la recherche sur la base de données SQL (j'utilise PHPmyAdmin) d'une ligne, le temps de réponse est trop long et le programme s'arrête lorsqu'il est dans la fonction ReadRecord (qui permet d'aller chercher dans la base de données.

    Je veux, lorsque je clique sur le bouton qui me lance la recherche, que le programme aille chercher dans la base le chemin d'accès que j'ai récupéré au préalable. Il contient des anti slashs que je suppose être la cause du problème, mais sans certitude ni moyen de le vérifier. Je sais que l'anti slash est utilisé comme caractère d'espacement dans SQL, mais je ne pense pas que cela intervienne. Voici les quelques lignes qui permettent à mon programme d'aller chercher le chemin d'accès dans la base de données puis d'ouvrir le fichier correspondant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub ButtonCreer_Click(sender As Object, e As EventArgs) Handles ButtonCreer.Click
            Dim requete As String = "Select chemin from references where type = '" & ComboBoxType.Text & "';"
     
            Dim reponseSelect As DataTable
            reponseSelect = readRecord(requete)
            Process.Start(reponseSelect.Rows(0).Item("chemin").ToString)
        End Sub
    J'ai fait un pas à pas détaillé, et le programme s'arrête dans la fonction ReadRecord. J'ai essayé avec d'autres entités comme la vitesse (qui est seulement un nombre à 4 chiffres), et cela fonctionne.

    Auriez vous une idée d'où cela pourrait venir ? Ou plutôt comment résoudre le problème..

    Merci beaucoup.

  2. #2
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    ReadRecord est une fonction perso ou du framework (je ne la connais pas) ?
    Quand tu dis "Le programme s'arrête", tu catch une exception ? Tu es en débug ?
    Dans ta base, les chemins contiennent bien l'anti-slash ? Sont-ils doublés ?

    Question annexe : Pourquoi charger une datatable si tu ne veux récupérer qu'une ligne ?

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut
    Readrecord est une fonction récupérée sur internet qui permet de lire une base de données. Quand je dis que le programme s'arrête, c'est en fait une tempo à l'intérieur de la fonction ReadRecord qui arrête le programme lorsque le temps de réponse de la base est trop long.

    Les chemins d'accès contiennent bien des anti-slashs puisque je les ai doublés lors de la saisie dans la base.

    La récupération se fait bien lorsque je prend des petites entités comme la vitesse, je pense donc que cela vient du format du chemin d'accès.

  4. #4
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Peut-on voir le code de ReadRecord ?

    Si en débug tu récupères la valeur de variable requête (donc avec la concaténation de ta Combo), et que tu la c/c dans ton SGBD, elle s’exécute et tu as bien un retour ?

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    un chronomètre (c'est souvent utile d'avoir des chiffres) : system.Diagnostics.stopwatch (.Start .Stop .ElapsedMilliseconds)

    le temps de lecture d'une ligne ne doit pas être long, c'est peut etre le temps d'exécution de la requête qui est long, pour vérifier ca phpmyadmin a peut etre des outils de profiling/statistiques
    combien y a t il de lignes dans la table ? la colonne de recherche est elle indexée ?

    le code de ta fonction ? as tu compris ce code ?

    une tempo pour arrêter une requete qui met du temps ca me parait étrange, si on veut le résultat de la requete il faut bien l'exécuter même si c'est long ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut
    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
    Public Function readRecord(ByVal query As String) As DataTable
     
            'initialiser le dataset
            Dim samplesource As New DataSet
            Dim Table As DataTable
     
     
            Try
                'initialiser l'objet de connexion
                Dim connection As New MySqlConnection(connStr)
                'créer l'objet de commande
                Dim samplecommand As New MySqlCommand
                'initialiser l'adaptateur sql
                Dim sampledataadapter = New MySqlDataAdapter()
     
                'ouvrir la connexion
                connection.Open()
     
                samplecommand.CommandText = query                   'détermine la requête
                samplecommand.Connection = connection               'connecte l'objet de commande avec la connexion active
                sampledataadapter.SelectCommand = samplecommand     'déclare l'objet de commande à l'a
                sampledataadapter.Fill(samplesource)                'rempli la table avec les données de l'adaptateur
                Table = samplesource.Tables(0)
     
                connection.Close()
     
                Return Table
     
            Catch ex As Exception
                MsgBox("Connexion impossible à la base " & ex.Message, MsgBoxStyle.Critical)
     
            End Try
     
        End Function
    Voici le code de la fonction ReadRecord. Je ne l'ai pas forcément compris puisque nous l'avons récupéré sur Internet.

    Si je debug, et rentre la requête SQL directement dans mon SGBD, j'ai effectivement un résultat qui me revient, avec le chemin d'accès correctement écrit.

    Il y a très peu de lignes pour le moment, puisque j'ai seulement fait des tests avec la base. Elle servira plus tard pour un sous-traitant, qui la remplira lui même avec l'onglet d'ajout de références.

    Je n'ai pas d'index dans la table, puisque chaque ligne à un code unique (la référence du moteur).

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    sur quelle ligne de la fonction ca s'"arrête" ?

    Citation Envoyé par QuentLM Voir le message
    Voici le code de la fonction ReadRecord. Je ne l'ai pas forcément compris puisque nous l'avons récupéré sur Internet.
    utiliser du code qu'on ne comprend pas n'est pas une bonne pratique
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut
    Le code s'arrête à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sampledataadapter.Fill(samplesource)                'rempli la table avec les données de l'adaptateur
    Un arrêt se produit puis la programme pas à la ligne :

    Ce programme est à utilité professionnelle, je n'ai malheureusement pas le temps pour créer tout moi même et tout comprendre du programme.

  9. #9
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Utiliser un DataTable et un DataAdapter pour une colonne de table c'est assez lourdingue et pas adapté à ton cas comme traitement quand même ...

    Tu peux tenter qqch comme :

    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
    Public Function executeSelect(query As String, con As MySqlConnection) As MySqlDataReader
     
            Dim samplecommand As New MySqlCommand
            Dim resultat As MySqlDataReader = Nothing
     
            Try
     
     
                con.Open()
     
                samplecommand.CommandText = query
                samplecommand.Connection = con
     
                resultat = samplecommand.ExecuteReader()
     
     
            Catch ex As Exception
                Throw New System.Exception(ex.ToString)
            End Try
     
            Return resultat
     
        End Function

    Nb : Pas du tout essayé, je connais pas les objets de MySql, mais ça devrait ressembler à ça

    Ensuite avec ton reader retourné tu n'as plus qu'à le lire (et tester qu'il ne soit pas Nothing)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Using con As New mysqlConnection(connStr)
     
                Dim tonReader As mySqlDataReader = executeSelect(TaRequeteString, con)
     
                If tonReader IsNot Nothing Then
                    If tonReader.Read()
     
     
                        TonChemin = tonReader(0).ToString
     
     
                    End if
                End If
            End Using
    EDIT: J'ai modifié qlqes trucs

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    Citation Envoyé par QuentLM Voir le message
    Un arrêt se produit puis la programme pas à la ligne :

    oui donc il y a une erreur d'exécution, et il faut alors regarder le message d'erreur
    et tu ferais mieux te t'interresser aux bases de .NET, parce que perdre une demie journée pour apprendre à lire un message d'erreur ca me parait beaucoup
    en moins de temps que ca sur un tuto tu aurais déjà compris ca


    Citation Envoyé par QuentLM Voir le message
    Ce programme est à utilité professionnelle, je n'ai malheureusement pas le temps pour créer tout moi même et tout comprendre du programme.
    ah d'accord je croyais que c'était un truc important pour des tests à la maison, mais si c'est à utilité professionnelle ça ne sert en effet à rien de trop s'y attarder, ce n'est pas grave si ca ne marche pas



    Citation Envoyé par _Ez3kiel Voir le message
    Utiliser un DataTable et un DataAdapter pour une colonne de table c'est assez lourdingue et pas adapté à ton cas comme traitement quand même ...
    certes, mais même si c'est 4x plus lent que la version bien codée, ca restera rapide pour une ligne, et ca fonctionne, et ca prend peu de lignes de code
    enfin ce n'est pas ce qui me chagrine le plus dans ce topic
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    certes, mais même si c'est 4x plus lent que la version bien codée, ca restera rapide pour une ligne, et ca fonctionne, et ca prend peu de lignes de code
    enfin ce n'est pas ce qui me chagrine le plus dans ce topic
    Oui je sais bien , mais je me disais que si la table était mal faite(pas d'indexation, full access, etc), il était peut-être en timeout au moment du Fill (vu qu’apparemment c'est là qu'il part en catch ...) donc ça pourrait réduire un chouilla et peut-être éviter le Timeout ... Que des suppositions hein, vu que le catch sert pas à récupérer l'exception ... !

    Mais oui c'est pas le plus grave du topic, si le code est du c/c incompris, j'ai peur que la structure de la bdd suive le même chemin bâclé (supposition toujours, c'est pas méchant) ...

    Pour votre bien j'espère que c'est un programme éphémère ...

  12. #12
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut
    Problème résolu finalement... C'était tellement bête que je vous ai induit en erreur.

    Ma table était en utc......., alors qu'elle aurait du être en latin1_swedish...

    Désolé de vous avoir fait perdre du temps ! Enfin cela prouve bien que votre forum est très intéressant et réactif.

    Merci pour votre aide et encore désolé.

    A bientôt

  13. #13
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Bon ba ... Bon courage pour la suite.

    Ps :
    Citation Envoyé par QuentLM Voir le message
    Je n'ai pas d'index dans la table, puisque chaque ligne à un code unique (la référence du moteur).
    Je ne suis pas DBA donc ma parole n'est pas vérité absolue, mais supposant que la référence du moteur est un char ou varchar, ce serait pas du luxe d'avoir tout de même un index en integer comme clé primaire de ta base (même un bête auto-inc), ça évitera de faire des full access sur la table quand tu l'interrogeras. Ça mange pas de pain à faire et ça évitera quelques lenteurs par la suite ...

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Par défaut
    J'ai du mal à comprendre l'intérêt de la clé primaire dans ce cas. Ne suffit t-il pas qu'une colonne contienne des entités uniques pour qu'elle serve "automatiquement" de clé primaire ?

    Le type du moteur rentré par l'utilisateur me permet de récupérer le chemin d'accès du fichier "lié" au moteur et de l'ouvrir. Sachant que le type est unique, pourquoi faire une colonne avec un auto-increment ?

    Je ne met pas en doute ta parole, j'ai juste besoin d'informations supplémentaires afin d'améliorer mon programme et de mieux comprendre le fonctionnement de SQL

  15. #15
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    il y a peut etre des cas où une clé primaire n'est pas utile, mais c'est loin d'être la majorité

    si j'ai bien compris ta table contient une colonne de type texte
    si dans une autre table tu peux faire un lien vers cette table, tu sera obligé de recopier le string entier
    après si tu veux faire un where sur cette 2ème table pour trouver les lignes ayant tel string ca va être beaucoup plus long que le cas ou :
    tu as une clé entière auto incrément avant la colonne avec le chemin, cette colonne sera utilisé pour pointer vers un ligne, gagnant de la place (int32 = 4 octets, un string unicode = 2octets par caractère)
    au passage les indexes seront beaucoup plus rapides en travaillant sur des nombres

    encore une chose dépendante des sgbdr, sur sql server par défaut les clé primaire sont clustered, c'est à dire ordonner physiquement, avec une clé sur une colonne texte, suite à un insert toute la table est modifiée pour s'ordonner, donc quand il y a beaucoup de lignes ca perd du temps à chaque insert
    avec un nombre auto incrément, la dernière ligne va toujours à la fin donc ca ne pose pas de problèmes

    après si ta table n'est liée à rien et contient juste une liste pas de soucis je pense
    se pose après la question de l'évolutivité, qui te dit qu'un jour cette table ne sera pas liée ou n'évoluera pas, et si tu restes
    par exemple si tu dois avoir un libellé lié à chaque chemin (en général plus pratique dans un combobox ou une liste) et que tu veux logger les heures de lancement des chemins, il te faudra une clé
    mais dans ce cas aussi ca peut se rajouter après
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. [MySQL] Récupération dans base SQL
    Par worldhugo dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 17/01/2009, 10h29
  2. [SQL] Faire une recherche plus modification dans base sql
    Par ju3979 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 09/08/2007, 18h26
  3. [SQL] Problème insertion dans Base SQL après saisie d'un formulaire
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 15/05/2007, 14h44
  4. Builder Borland C++ 6 : Ecrire dans base SQL
    Par AngelFire dans le forum C++Builder
    Réponses: 1
    Dernier message: 08/05/2007, 23h40
  5. [MySQL] Supprimer entrée dans base sql par un simple clique
    Par mickado dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/03/2007, 18h15

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