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

Windows Forms Discussion :

Boucle à l'infini avec While et un Reader


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 24
    Points
    24
    Par défaut Boucle à l'infini avec While et un Reader
    Bonjour à tous,

    Je suis entrain de faire des modifications sur des projets pour les cours et je me heurte a un probleme. J'ai plusieurs requete pour obtenir la liste de duplications, tant qu'il y la date issue du resultat de la requete sera le meme numero de jour que celui d'ajourd'hui on va inserer une date. Dans ma table je n'ai qu'un seul résultat qui correspond. Cependant au lancement de l'app, j'ai une boucle infinie qui me crée des insertions jsuqu'a ce que j'arrete le lancement. J'ai beau regardé le code long en large mais rien ... Pouvez vous m'aider ?
    Merci d'avance

    mrocks

    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
            'Déclaration des variables de type OleDbCommand
            Dim MyCommand As OleDbCommand = MyConnexion.CreateCommand()
            Dim MyCommandMax As OleDbCommand = MyConnexion.CreateCommand()
            Dim MyCommandInsert As OleDbCommand = MyConnexion.CreateCommand()
            Dim MyCommandSelect As OleDbCommand = MyConnexion.CreateCommand()
     
            'Reader pour obtenir la liste des duplications où la fréquence de duplication est différent de "Unique"
            MyCommand.CommandText = "SELECT * FROM Duplication WHERE dup_frq <> 'Unique'"
            MyCommand.ExecuteNonQuery()
            Dim MyReader As OleDbDataReader = MyCommand.ExecuteReader
     
            'Enregistrement des informations sur les duplications dans un tableau
            Dim nb_enr As Integer = 0
            Do While MyReader.Read()
                Dim tmp_jrs As Date = Today
                Dim tmp_jrs_today As Date = MyReader.GetValue(2)
     
                If (tmp_jrs.DayOfWeek = tmp_jrs_today.DayOfWeek) Then
     
                    'Reader pour obtenir l'identifiant maximal utilisé
                    MyCommandMax.CommandText = "SELECT MAX(dup_idt) FROM Duplication"
                    MyCommandMax.ExecuteNonQuery()
     
                    'Attribution d'une valeur à la variable "id_max"
                    Dim MyReaderMax As OleDbDataReader = MyCommandMax.ExecuteReader
                    Dim id_max As Integer
     
                    Do While MyReaderMax.Read()
                        id_max = MyReaderMax.GetValue(0)
                    Loop
                    MyReaderMax.Close()
     
                    'Execution de la réquete de duplication en fonction du "dup_frq"
                    Select Case MyReader.GetValue(6)
                        Case "Quotidien"
                            MyCommandInsert.CommandText = "INSERT INTO Duplication VALUES ('" & (id_max + 1) & "', '" & MyReader.GetValue(1) & "', '" & MyReader.GetValue(2) & "', '" & MyReader.GetValue(2).AddDays(1) & "', '" & MyReader.GetValue(4) & "', '" & MyReader.GetValue(5) & "', '" & MyReader.GetValue(6) & "', '')"
                        Case "Hebdomadaire"
                            MyCommandInsert.CommandText = "INSERT INTO Duplication VALUES ('" & (id_max + 1) & "', '" & MyReader.GetValue(1) & "', '" & MyReader.GetValue(2) & "', '" & MyReader.GetValue(2).AddDays(7) & "', '" & MyReader.GetValue(4) & "', '" & MyReader.GetValue(5) & "', '" & MyReader.GetValue(6) & "', '')"
                        Case "Bimensuel"
                            MyCommandInsert.CommandText = "INSERT INTO Duplication VALUES ('" & (id_max + 1) & "', '" & MyReader.GetValue(1) & "', '" & MyReader.GetValue(2) & "', '" & MyReader.GetValue(2).AddDays(14) & "', '" & MyReader.GetValue(4) & "', '" & MyReader.GetValue(5) & "', '" & MyReader.GetValue(6) & "', '')"
                        Case "Mensuel"
                            MyCommandInsert.CommandText = "INSERT INTO Duplication VALUES ('" & (id_max + 1) & "', '" & MyReader.GetValue(1) & "', '" & MyReader.GetValue(2) & "', '" & MyReader.GetValue(2).AddMonths(1) & "', '" & MyReader.GetValue(4) & "', '" & MyReader.GetValue(5) & "', '" & MyReader.GetValue(6) & "', '')"
                    End Select
                    MyCommandInsert.ExecuteNonQuery()
     
                End If
     
            Loop
            MyReader.Close()

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est pas très joli comme code

    tes executenonquery ne servent à rien vu si tu fais un executereader derrière (à part perdre un peu de temps peut etre ...)

    et à vu de nez en connaissant le langage SQL tu peux faire le tout en une seule requete de quelques lignes, sans boucle et donc avec un temps d'execution de l'ordre de l'instantané
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Ok merci pour le commentaire vis a vis du code.
    Je suis un peu "léger" niveau connaissance en VB.net tu pourrais m'expliquer un peu comment eviter les trucs qui "ne servent à rien" dans mon code si tu as 2min ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il y a des tutos sur vb et sur sql sur le net
    pour faire une seule requete il suffit de se poser les bonnes questions, qu'est-ce que tu veux réellement faire, et en connaissant les instructions sql il y a des solutions
    il y a d'ailleurs un forum sql et un forum par sgbdr, où tu pourrais demander quelle requete faire pour faire un seul insert, mais comme je le disais il faut réussir à comprendre en francais ce que tu veux faire avant de le transformer en sql
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Points : 97
    Points
    97
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    'Déclaration des variables de type OleDbCommand
            Dim MyCommand As OleDbCommand = MyConnexion.CreateCommand()
            Dim MyCommandMax As OleDbCommand = MyConnexion.CreateCommand()
            Dim MyCommandInsert As OleDbCommand = MyConnexion.CreateCommand()
            Dim MyCommandSelect As OleDbCommand = MyConnexion.CreateCommand()
     
            'Reader pour obtenir la liste des duplications où la fréquence de duplication est différent de "Unique"
            MyCommand.CommandText = "SELECT * FROM Duplication WHERE dup_frq <> 'Unique'"
            MyCommand.ExecuteNonQuery()
            Dim MyReader As OleDbDataReader = MyCommand.ExecuteReader
     
            'Enregistrement des informations sur les duplications dans un tableau
            Dim nb_enr As Integer = 0
            While MyReader.Read()  
              Dim tmp_jrs As Date = Today
                Dim tmp_jrs_today As Date = MyReader.GetValue(2)
     
                If (tmp_jrs.DayOfWeek = tmp_jrs_today.DayOfWeek) Then
     
                    'Reader pour obtenir l'identifiant maximal utilisé
                    MyCommandMax.CommandText = "SELECT MAX(dup_idt) FROM Duplication"
                    
                    'Attribution d'une valeur à la variable "id_max"
                    Dim MyReaderMax As OleDbDataReader = MyCommandMax.ExecuteReader
                    Dim id_max As Integer
     
                    if MyReaderMax.Read()
                        id_max = MyReaderMax.GetValue(0)
                    end if
                    MyReaderMax.Close()
     
                    'Execution de la réquete de duplication en fonction du "dup_frq"
                    Select Case MyReader.GetValue(6)
                        Case "Quotidien"
                            MyCommandInsert.CommandText = "INSERT INTO Duplication VALUES ('" & (id_max + 1) & "', '" & MyReader.GetValue(1) & "', '" & MyReader.GetValue(2) & "', '" & MyReader.GetValue(2).AddDays(1) & "', '" & MyReader.GetValue(4) & "', '" & MyReader.GetValue(5) & "', '" & MyReader.GetValue(6) & "', '')"
                        Case "Hebdomadaire"
                            MyCommandInsert.CommandText = "INSERT INTO Duplication VALUES ('" & (id_max + 1) & "', '" & MyReader.GetValue(1) & "', '" & MyReader.GetValue(2) & "', '" & MyReader.GetValue(2).AddDays(7) & "', '" & MyReader.GetValue(4) & "', '" & MyReader.GetValue(5) & "', '" & MyReader.GetValue(6) & "', '')"
                        Case "Bimensuel"
                            MyCommandInsert.CommandText = "INSERT INTO Duplication VALUES ('" & (id_max + 1) & "', '" & MyReader.GetValue(1) & "', '" & MyReader.GetValue(2) & "', '" & MyReader.GetValue(2).AddDays(14) & "', '" & MyReader.GetValue(4) & "', '" & MyReader.GetValue(5) & "', '" & MyReader.GetValue(6) & "', '')"
                        Case "Mensuel"
                            MyCommandInsert.CommandText = "INSERT INTO Duplication VALUES ('" & (id_max + 1) & "', '" & MyReader.GetValue(1) & "', '" & MyReader.GetValue(2) & "', '" & MyReader.GetValue(2).AddMonths(1) & "', '" & MyReader.GetValue(4) & "', '" & MyReader.GetValue(5) & "', '" & MyReader.GetValue(6) & "', '')"
                    End Select
                    MyCommandInsert.ExecuteNonQuery()
     
                End If
     
            End while
            MyReader.Close()

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    D'après moi, l'instruction "read()" boucle à l'infinie car elle boucle sur les enregistrements que tu insères dans la table "Duplication" au fur et à mesure:

    http://msdn.microsoft.com/fr-fr/libr...er(VS.80).aspx

    Les modifications apportées à un jeu de résultats par un autre processus ou thread pendant la lecture des données peuvent être visibles par l'utilisateur de OleDbDataReader.
    Une solution moins propre que la réécriture en sql consiterai à stocker dans un tableau tes instructions, puis de les éxecuter après ta boucle.

Discussions similaires

  1. Boucle saisie clavier avec while
    Par bm dans le forum Général Python
    Réponses: 2
    Dernier message: 12/05/2014, 10h00
  2. [Débutant] Boucle infini avec while
    Par Romm1 dans le forum Interfaces Graphiques
    Réponses: 7
    Dernier message: 23/03/2011, 11h38
  3. Boucle sans fin avec while..do
    Par chahinerue6 dans le forum Langage
    Réponses: 13
    Dernier message: 24/03/2010, 18h50
  4. paint() en boucle infinie avec JDesktopPane
    Par Spidy dans le forum Débuter
    Réponses: 6
    Dernier message: 19/03/2009, 16h31
  5. Boucle infini avec exploitation d'un resultset
    Par mithrendil dans le forum JDBC
    Réponses: 5
    Dernier message: 01/02/2008, 16h21

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