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ésultat complet d'une requète SELECT


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 156
    Par défaut Résultat complet d'une requète SELECT
    bien le bonjour a vous

    je viens à vous car je souhaiterai simplifier mon code, qui me parait plus de la bidouille.

    en gros je lance une requête SELECT et je voudrais récupérer dans un tableau le résultat.

    voici ce que j'ai essayé, mais il ne fait qu'une seule boucle

    J'ai dans ma base une table qui comporte 10 colonnes.

    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
        Public Shared Sub Requete_Read(ByVal Table As String, ByVal Colonne As String, ByRef str_Resultat() As String, ByVal Parametre_Where As String)
     
            Dim Obj_Command_Liste As OleDbCommand
            Dim Obj_DataAdapter As OleDbDataAdapter
            Dim Obj_DataSet As New DataSet
            Dim Obj_DataTable As New DataTable
            Dim SQL As String = ""
     
            'Requête permettant de liste la liste des produits
            SQL = "SELECT " & Colonne & " FROM " & Table & " " & Parametre_Where
     
            Try
                'Ouverture table
                Obj_Command_Liste = New OleDbCommand(SQL)
                Obj_DataAdapter = New OleDbDataAdapter(Obj_Command_Liste)
                Obj_Command_Liste.Connection = Obj_Connect
                Obj_DataAdapter.Fill(Obj_DataSet, Colonne)
                Obj_DataTable = Obj_DataSet.Tables(Colonne)
     
                'Parcourt la liste des lignes retournées
                Do While (i < Obj_DataTable.Columns.Count)
                    ReDim Preserve str_Resultat(i)
                    str_Resultat(i) = Obj_DataTable.Columns(i).ToString
                    i += 1
                Loop
     
                ' libération de la mémoire
                Obj_Command_Liste = Nothing
                Obj_DataSet = Nothing
                Obj_DataAdapter = Nothing
                Obj_DataTable = Nothing
     
            Catch ex As Exception
                MsgBox("Erreur dans la requète d'écriture." & vbCrLf & ex.Message)
            End Try
     
        End Sub
    Merci pour votre aide

  2. #2
    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
    étrange code ...

    essaye de mettre i à 0 avant de faire la boucle, ca parait logique
    et puis tant qu'à faire utiliser une variable de sub plutot qu'une variable de classe
    le redim preserve et les tableaux il faut oublier, c'est d'un autre age

    et puis en général on demande la requete as string plutot que les morceaux ... ca restreint l'utilisation et ca peut créer des bugs

    mettre à nothing ne sert à rien, ca ne libère pas la mémoire .dispose libère la mémoire (immédiatement) sur des classes non mangées par contre

    tu peux aussi faire du pas à pas pour voir ce qui cloche
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Il y a plusieurs points à revoir dans ton code.

    Concernant la récupération des données, il m'apparaît plus judicieux d'utiliser un DataReader au lieu d'un DataSet+DataTable+DataAdapter.
    Pour voir son fonctionnement, un petit tour sur la MSDN suffira.

    Sur les autres points :
    1. Pourquoi utilises-tu un tableau à une seule dimension ? Dont le nombre de cases est égal au nombre de lignes de la DataTable multiplié par le nombre de colonnes
    2. Le redim preserve ne sert à rien étant donnée la remarque ci-dessus
    3. Le catch (Exception), tu mets un message disant que la requête n'est pas bonne, déjà merci le copier-coller il me semble, puis rien ne te dit que c'est la requête qui est mauvaise, il vaudrait mieux catcher une SqlException.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 156
    Par défaut
    oula, si je m'attendais à tout cela.
    ce code fonctionne pourtant bien pour lister dans une table tous les éléments d'une colonne.

    et je n'ai pas de message d'erreur. Je ne récupère juste (dans str_Resultat()) qu'un seul résultat.
    Alors que j'aurai souhaité
    str_Resultat(0) = élément de la 1ère colonne
    str_Resultat(1) = élément de la 2ème colonne
    str_Resultat(2) = élément de la 3ème colonne
    str_Resultat(3) = élément de la 4ème colonne
    .....

    Est ce que ce que http://dotnet.developpez.com/articles/ado1/vbnet/ me permettrait d'etre sur une bonne voie ?

  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
    ton code fonctionne peut etre mais il est pas très joli et loin d'être le plus optimisé

    dans ta variable Colonne tu mets plusieurs colonnes séparées par des virgules ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 156
    Par défaut
    Je pensais en faite mettre '*' dans l'appel du Sub.

    Mais je pense que je vais essayer le site que j'ai donné et je viendrais vous donner le code que j'ai utilisé et tout ce qui suit.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 156
    Par défaut
    Voici ce que cela donne avec un DataReader

    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
    51
    52
    53
    54
    55
    56
    57
    Public Shared Sub Requete_Read(ByVal Table As String, ByVal Colonne As String, ByRef str_Resultat() As String)
     
            Dim Obj_Command_Liste As OleDbCommand
            Dim Obj_DataRead As OleDbDataReader
            Dim SQL As String = ""
     
            'Déclaration d'une variable déterminant les colonnes récupérées
            Dim ResultCol As Object()
            Dim NmbLigne As Integer = 0
            Dim Ligne As String = ""
            ReDim str_Resultat(0)
     
            'Requête permettant de liste la liste des produits
            SQL = "SELECT " & Colonne & " FROM " & Table & " ORDER BY " & Colonne
     
            Try
                'Ouverture table
                Obj_Command_Liste = New OleDbCommand(SQL, Obj_Connect)
                Obj_DataRead = Obj_Command_Liste.ExecuteReader()
     
                'Création du tableau comportant "Obj_DataRead.FieldCount - 1" éléments correspondant au colonne de la BDD
                ResultCol = New Object(Obj_DataRead.FieldCount - 1) {}
     
                'Tant que le Read contient des données faire ...
                While Obj_DataRead.Read()
     
                    Ligne = ""
                    ReDim Preserve str_Resultat(NmbLigne)
     
                    Obj_DataRead.GetValues(ResultCol)
     
                    For i As Integer = 0 To ResultCol.GetLength(0) - 1
                        If Not ResultCol(i) Is DBNull.Value Then
                            Ligne = Ligne + ResultCol(i).ToString
                        Else
                            Ligne = Ligne + "NULL"
                        End If
                        If i < ResultCol.GetUpperBound(0) Then
                            Ligne = Ligne + "|"
                        End If
                    Next
     
                    str_Resultat(NmbLigne) = Ligne
     
                    NmbLigne += 1
     
                End While
     
                ' libération de la mémoire
                Obj_DataRead.Close()
                Obj_Command_Liste.Dispose()
     
            Catch ex As Exception
                MsgBox("Erreur dans la requète d'écriture." & vbCrLf & ex.Message)
            End Try
     
        End Sub
    Mais vous avez dis de ne pas utiliser de redim, mais je ne voit pas comment faire autrement.
    une petite piste ??

    merci par avance

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 17/06/2008, 10h54
  2. Réponses: 2
    Dernier message: 14/05/2007, 16h18
  3. [MySQL] comment exploiter le résultat d'une requête SELECT ?
    Par @min@ dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/04/2007, 20h52
  4. Réponses: 2
    Dernier message: 20/04/2007, 13h48
  5. problème avec les résultats d'une requête select top1
    Par kariiim dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/03/2007, 15h05

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