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 :

Imbrication d'ExecuteReader sur une même table.


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Par défaut Imbrication d'ExecuteReader sur une même table.
    Bonjour à tous,

    Débutant en VB.net dans le cadre de mon nouveau stage, je cherche à imbriquer plusieurs requêtes sur une même table.
    Je m'explique, je dois afficher l'arborescence du site sur lequel je travaille, en affichant les pages mères et enfants.
    Pour les pages mère aucun problème, mais je souhaiterai afficher les pages enfants sous chacune de celles-ci via une requête PageId = ParentId.

    Connaissez-vous une solution autre que la méthode ExecuteReader, sachant que je ne peux ouvrir 2 readers en même temps !

    Merci et à bientôt.

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Par défaut
    Citation Envoyé par Le Mad Voir le message
    Connaissez-vous une solution autre que la méthode ExecuteReader, sachant que je ne peux ouvrir 2 readers en même temps !
    Pourquoi ne pas exécuter tes requêtes les unes à la suite des autres ?
    Je ne comprends pas ce qui te bloque...

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Par défaut
    Le problème est que je dois tout afficher sur une comboBox, donc je dois parcourir les pages de niveau 0 et pour chacune d'elles, les pages de niveau 1, puis 2, 3...etc.

    Pour le moment, j'ai cela, mais ça ne marche pas pleinement.

    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
     
    Dim connectString As String = "database=*******;server=******;User ID=dnn;pwd=*******)"
    Dim connection As SqlConnection = New SqlConnection(connectString)
            connection.Open()
    Dim command As SqlCommand = New SqlCommand("SELECT * FROM Tabs WHERE IsDeleted = 0 AND IsVisible = 1 AND TabOrder < 10000 AND PortalId = 0 ORDER BY TabOrder", connection)
    Dim reader As SqlDataReader = command.ExecuteReader
     
    While reader.Read()
        If (reader.GetValue(6).Equals(0)) Then
                    comboBox.Items.Add(New ListItem(reader.GetString(3), reader.GetValue(0)))
        ElseIf (reader.GetValue(6).Equals(1)) Then
                    comboBox.Items.Add(New ListItem(" - - " & reader.GetString(3), reader.GetValue(0)))
        ElseIf (reader.GetValue(6).Equals(2)) Then
                    comboBox.Items.Add(New ListItem(" - - - - - " & reader.GetString(3), reader.GetValue(0)))
        ElseIf (reader.GetValue(6).Equals(3)) Then
                    comboBox.Items.Add(New ListItem(" - - - - - - - " & reader.GetString(3), reader.GetValue(0)))
        End If
    End While
     
    reader.Close()
    connection.Close()
    Merci pour ta réponse.

    La chose qui serait bien serait de charger les données de la table, avec la requête que je viens d'utiliser, et de travailler dessus hors connexion.
    Je viens de trouver les dataset, mais j'avoue n'y rien comprendre.

    A bientôt.

  4. #4
    Membre chevronné
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Par défaut
    A mon avis, tu devrais passer par une étape intermédiaire entre le résultat de ta requête et l'affichage à l'écran.

    Tu devrais créer une classe Page qui a (à minima) un Id, une propriété Child qui est également du type Page et une méthode Display().
    Si ta requête est bien construite, en une seule itération sur le résultat de ta requête tu peux créer les instances de ta classe Page et créer les liaisons entre les parents et les enfants.
    Ensuite ta méthode Display() de la classe Page affiche la description de la page courante + elle déclenche la méthode Display() de ses descendants.

    Je n'ai pas compris si chaque page n'avait qu'un seul enfant ou si elle pouvait en avoir plusieurs. Si c'est plusieurs, tu peux utiliser une Collection<Page> pour stocker les enfants d'une page.

    Ensuite, pour remplir ta ComboBox, il te suffit de déclencher la méthode Display() sur tes pages de niveau 0, tout le reste se fera tout seul.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Par défaut
    Oui, chaque page peut avoir plusieurs enfants, je vais essayer ton idée, en espérant qu'elle porte ses fruits !
    Je débute à peine en VB.net

    Merci et à bientôt.

  6. #6
    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
    lu en diagnoale, mais il est possible d'avoir plusieurs reader en meme temps

    si c'est une volonté de ta part, il y a aussi des solutions pour avoir une arborescence via une seule requete, soit avec un procédure stockée, soit avec une requete récursive (cte), soit avec un requete qui remonte parents et enfants et un tri dans vb

    sachant qu'en plus, faire une requete par parent pour avoir les enfants n'est pas le plus rapide
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Par défaut
    Bonjour sperot51,

    Je conçois qu'imbriquer plusieurs datareader l'un dans l'autre n'est pas la meilleure solution, ceci incluant l'execution de multiples requêtes !

    Quoiqu'il en soit, je cherche une solution simple et économique en ressource. Je ne connais pas les requêtes CTE, ce sont des requêtes à stocker coté SQL server 2005 ? Ou est-il possible que leurs exécutions se fasse dans VB.Net ?

    A bientôt et merci pour ta réponse.

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Par défaut
    ReBonjour,

    Je viens de créer ma requête CTE de la sorte, elle fonctionne comme je le souhaite sous SQL server 2005, mais je n'ai aucune idée de comment l'utiliser ensuite dans VB.Net.
    Quelqu'un pourrait-il m'indiquer la démarche à suivre ?

    Voici le code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH tree_tabs(name, id, LEVEL, portal, visible, deleted, tri) AS (SELECT     TabName, TabID, 0, PortalId, IsVisible, IsDeleted, TabOrder
              FROM Tabs
              WHERE ParentId IS NULL AND TabOrder < 10000
              UNION ALL
              SELECT TabName, TabID, t . LEVEL + 1, PortalId, IsVisible, IsDeleted, TabOrder
              FROM Tabs ta INNER JOIN tree_tabs t ON t .id = ta.ParentId
              WHERE TabOrder < 10000)
    SELECT SPACE(LEVEL * 10) + name AS Name, id, LEVEL, portal, visible, deleted, tri
    FROM tree_tabs
    WHERE deleted = 0 AND visible = 1 AND portal = 3
    ORDER BY tri, id, LEVEL, name
    Merci et à bientôt.

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Par défaut
    Ca marche !
    Merci à tous pour vos réponses...

    Je vous pose le code, ça peut toujours aider par la suite :

    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
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
            Dim connectString As String = "database=ATINTERNET;server=*****;User ID=*****;pwd=*****)"
            Dim connection As SqlConnection = New SqlConnection(connectString)
            connection.Open()
            Dim req As String = "WITH tree_tabs(name, id, LEVEL, portal, visible, deleted, tri) AS (SELECT TabName, TabID, 0, PortalId, IsVisible, IsDeleted, TabOrder "
            req = req & "FROM Tabs "
            req = req & "WHERE ParentId IS NULL AND TabOrder < 10000 "
            req = req & "UNION ALL "
            req = req & "SELECT TabName, TabID, t.LEVEL + 1, PortalId, IsVisible, IsDeleted, TabOrder "
            req = req & "FROM Tabs ta INNER JOIN "
            req = req & "tree_tabs t ON t.id = ta.ParentId "
            req = req & "WHERE TabOrder < 10000) "
            req = req & "SELECT name, id, LEVEL, portal, visible, deleted, tri "
            req = req & "FROM tree_tabs "
            req = req & "WHERE deleted = 0 AND visible = 1 AND portal = 3 "
            req = req & "ORDER BY tri, id, LEVEL, name "
     
            Dim command As SqlCommand = New SqlCommand(req, connection)
            Dim reader As SqlDataReader = command.ExecuteReader
     
            While reader.Read()
                Dim tab As String
                Select Case reader.GetValue(2)
                    Case 0
                        tab = ""
                    Case 1
                        tab = "| - - - - "
                    Case 2
                        tab = "| - - - - | - - - - "
                    Case Else
                        tab = ""
                End Select
                comboBox.Items.Add(New ListItem(tab & reader.GetString(0), reader.GetValue(1)))
            End While
     
            reader.Close()
            connection.Close()
     
        End Sub

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

Discussions similaires

  1. [MySQL] Plusieurs même requetes sur une même table
    Par bibom dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 27/07/2006, 12h54
  2. [DEB] Sousform et Form sur une même table
    Par ip203 dans le forum IHM
    Réponses: 1
    Dernier message: 08/06/2006, 13h23
  3. Sum différents sur sur une même table ...
    Par Saloucious dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/10/2005, 15h51
  4. Réponses: 2
    Dernier message: 29/09/2004, 09h07
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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