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 :

Mise à jour de plusieurs lignes Mysql [Débutant]


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    à mes temps perdus
    Inscrit en
    février 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : à mes temps perdus
    Secteur : Industrie

    Informations forums :
    Inscription : février 2007
    Messages : 53
    Points : 33
    Points
    33
    Par défaut Mise à jour de plusieurs lignes Mysql
    Bonjour à tous,
    je cherche depuis un petit moment .... mais en vain .....
    Comment sélectionner plusieurs enregistrements ( dans Mysql ), et les traiter ( par un UPDATE ) un par un, suivant l'id de la ligne.
    Si je décompose ce que je veux vous expliquer c'est :
    1 récupérer l'id de la ligne et modifier le numéro de la ligne ( dans une autre colonne ) non pas l'Id
    j'arrive déjà à récupérer l'id ..... mais pour la suite je suis perdu.
    si l'un de vous peut m'aider svp.
    Merci par avance.

    Mon code ( mais je suis pas sur d'être sue la bonne piste )
    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
    Dim strSQL = "SELECT * FROM cmdartdiv WHERE IdCmd='" & IdCommad & "'"
                    Mysqlconn.Open()
                    Dim cmd = New MySqlCommand(strSQL, Mysqlconn)
                    Dim dr = cmd.ExecuteReader()
                    Dim x1 = 0
                    Do While dr.Read()
                        x1 = x1 + 1
                        Dim IdLigne = dr("IdCmdArt").ToString
    'j'affiche ici dans msgbox l'id de la ligne et le nouveau numéro
                        MsgBox("Id de la ligne : " & IdLigne & " Nouveau numéro de la ligne : " & x1)
     
    'Et je désire par la suite mettre à jour la ligne suivant son Id 
     
                    Loop
                    dr.Close()
                    cmd.Dispose()
                    Mysqlconn.Close()
                    MsgBox("Fin")

  2. #2
    Membre éprouvé Avatar de Phil Rob
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2013
    Messages
    657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : novembre 2013
    Messages : 657
    Points : 1 099
    Points
    1 099
    Par défaut
    Bonsoir,


    Je ne compte pas solutionner ici ton problème mais seulement signaler une bizarrerie :

    Dans ta requête : Dim strSQL = "SELECT * FROM cmdartdiv WHERE IdCmd='" & IdCommad & "'", si IdCmd est un champ numérique dans la DB (c'est probablement le cas), alors il y a une erreur de syntaxe dans la requête, elle devrait être Dim strSQL = "SELECT * FROM cmdartdiv WHERE IdCmd= " & IdCommad.ToString.

    J'espère que cela te servira ...

    Bonne soirée,

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    à mes temps perdus
    Inscrit en
    février 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : à mes temps perdus
    Secteur : Industrie

    Informations forums :
    Inscription : février 2007
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Bonsoir,

    pour répondre ... pas forcément parce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim IdCommad As String = PlanifierCmd.ToolStripStatusLabel6.Text


    Bonne soirée à toi

  4. #4
    Membre éprouvé Avatar de Phil Rob
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2013
    Messages
    657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : novembre 2013
    Messages : 657
    Points : 1 099
    Points
    1 099
    Par défaut
    Je persiste toutefois sur un point : si IdCmd est un champ numérique dans la DB il ne faut pas mettre les simples quotes, mais si ta requête fonctionne comme tu le veux, alors oublie ma remarque ...

    Bonne soirée à toi aussi.

  5. #5
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2006
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 816
    Points : 4 164
    Points
    4 164
    Par défaut
    Bonjour,

    Pensez à utiliser les requêtes paramètrées. Ca évite plein de soucis comme des attaques par injection de code SQL.

    Voici le code à modifier qui devrait faire ce que vous désirez :

    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
      Dim IdCommad As Integer = 500
            Using Mysqlconn As New MySqlConnection("myConnectionString")
                Mysqlconn.Open()
                Using cmd = New MySqlCommand("SELECT * FROM cmdartdiv WHERE IdCmd = @IdCommad", Mysqlconn)
                    cmd.Parameters.Add("@IdCommad", MySqlDbType.Int32).Value = IdCommad
     
                    ' On crée la commande qui sera utilisée pour mettre à jour les lignes
                    ' Cette commande est crée avant la boucle pour éviter de la recréer à chaque énumération
                    ' Pense à changer "myOtherColumn" par la colonne désirée...
                    Using cmdUpdate = New MySqlCommand("UPDATE cmdartdiv 
                                                        SET myOtherColumn = @NewValue 
                                                        WHERE IdCmd = @IdCommad 
                                                            AND IdCmdArt = @IdCmdArt", Mysqlconn)
     
                        cmdUpdate.Parameters.Add("@IdCommad", MySqlDbType.Int32).Value = IdCommad ' L'id ne change jamais, on peut donc le mettre directement
                        ' Les deux paramètres suivant changent, ils seront rempli dans la boucle de lecture
                        cmdUpdate.Parameters.Add("@IdCmdArt", MySqlDbType.Int32) ' Je pars du principe que tout est en Int32, il faut mettre le bon type par rapport à la base de donnée pour chaque paramètre
                        cmdUpdate.Parameters.Add("@NewValue", MySqlDbType.Int32)
     
                        Using dr = cmd.ExecuteReader()
                            Dim x1 = 0
                            Do While dr.Read()
                                x1 = x1 + 1
                                Dim IdLigne = dr("IdCmdArt").ToString
                                'j'affiche ici dans msgbox l'id de la ligne et le nouveau numéro
                                MsgBox("Id de la ligne : " & IdLigne & " Nouveau numéro de la ligne : " & x1)
     
                                'Et je désire par la suite mettre à jour la ligne suivant son Id 
                                cmdUpdate.Parameters("@IdCmdArt").Value = IdLigne
                                cmdUpdate.Parameters("@NewValue").Value = IdCommad ' Le numéro de ligne à modifier dans ton autre colonne
                                Dim resultUpdate = cmdUpdate.ExecuteNonQuery()
                                Trace.WriteLine("Nombre de mise à jours pour la ligne " & IdLigne & " : " & resultUpdate)
                            Loop
                            MsgBox("Fin")
                        End Using ' Permet de se dispenser de dr.Close()
                    End Using ' Permet de se dispenser de cmdUpdate.Dispose()
                End Using ' Permet de se dispenser de cmd.Dispose()
            End Using ' Permet de se dispenser de Mysqlconn.Close()
    Ceci dit, il y a surement moyen de faire tout en une requête SQL suivant la valeur à mettre à jour ce qui serait bien plus efficace.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    à mes temps perdus
    Inscrit en
    février 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : à mes temps perdus
    Secteur : Industrie

    Informations forums :
    Inscription : février 2007
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Bonjour Sankasssss,

    merci d'avoir pris de le temps de regarder mon post et surtout d'y répondre

    j'ai testé le code et j'ai un erreur au niveau du RataReader, entre temps ( le temps d'avoir une réponse ). J'ai testé un peu le même genre de chose ( du bidouillage pour ma part )

    Et je me retrouvais avec la même erreur :

    Nom : Erreur-Data-Apophis.png
Affichages : 35
Taille : 2,7 Ko

  7. #7
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2006
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 816
    Points : 4 164
    Points
    4 164
    Par défaut
    Avec plaisir, le forum est là pour ça.
    J'ai oublié de déclarer une deuxième connexion.
    Voir lignes 3 , 15 et 41
    Code vb.net : 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
      Dim IdCommad As Integer = 500
            Using Mysqlconn As New MySqlConnection("myConnectionString")
                Using MysqlconnUpdate As New MySqlConnection("myConnectionString") ' <=== Changement ICI =======================
                    Mysqlconn.Open()
                    MysqlconnUpdate .Open()  ' <=== Changement ICI =======================
                    Using cmd = New MySqlCommand("SELECT * FROM cmdartdiv WHERE IdCmd = @IdCommad", Mysqlconn)
                        cmd.Parameters.Add("@IdCommad", MySqlDbType.Int32).Value = IdCommad
     
                        ' On crée la commande qui sera utilisée pour mettre à jour les lignes
                        ' Cette commande est crée avant la boucle pour éviter de la recréer à chaque énumération
                        ' Pense à changer "myOtherColumn" par la colonne désirée...
                        Using cmdUpdate = New MySqlCommand("UPDATE cmdartdiv 
                                                            SET myOtherColumn = @NewValue 
                                                            WHERE IdCmd = @IdCommad 
                                                                AND IdCmdArt = @IdCmdArt", MysqlconnUpdate ) ' <=== Changement ICI =======================
     
                            cmdUpdate.Parameters.Add("@IdCommad", MySqlDbType.Int32).Value = IdCommad ' L'id ne change jamais, on peut donc le mettre directement
                            ' Les deux paramètres suivant changent, ils seront rempli dans la boucle de lecture
                            cmdUpdate.Parameters.Add("@IdCmdArt", MySqlDbType.Int32) ' Je pars du principe que tout est en Int32, il faut mettre le bon type par rapport à la base de donnée pour chaque paramètre
                            cmdUpdate.Parameters.Add("@NewValue", MySqlDbType.Int32)
     
                            Using dr = cmd.ExecuteReader()
                                Dim x1 = 0
                                Do While dr.Read()
                                    x1 = x1 + 1
                                    Dim IdLigne = dr("IdCmdArt").ToString
                                    'j'affiche ici dans msgbox l'id de la ligne et le nouveau numéro
                                    MsgBox("Id de la ligne : " & IdLigne & " Nouveau numéro de la ligne : " & x1)
     
                                    'Et je désire par la suite mettre à jour la ligne suivant son Id 
                                    cmdUpdate.Parameters("@IdCmdArt").Value = IdLigne
                                    cmdUpdate.Parameters("@NewValue").Value = IdCommad ' Le numéro de ligne à modifier dans ton autre colonne
                                    Dim resultUpdate = cmdUpdate.ExecuteNonQuery()
                                    Trace.WriteLine("Nombre de mise à jours pour la ligne " & IdLigne & " : " & resultUpdate)
                                Loop
                                MsgBox("Fin")
                            End Using ' Permet de se dispenser de dr.Close()
                        End Using ' Permet de se dispenser de cmdUpdate.Dispose()
                    End Using ' Permet de se dispenser de cmd.Dispose()
                End Using ' Permet de se dispenser de Mysqlconn.Close()
           End Using ' <=== Changement ICI =======================

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    à mes temps perdus
    Inscrit en
    février 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : à mes temps perdus
    Secteur : Industrie

    Informations forums :
    Inscription : février 2007
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    ah ah ah tu as ( je me permet de dire tu ) tu as oublier de préciser la ligne 5 je te taquine

    En tout cas c'est nikel ça fonctionner à merveille

    J'ai juste modifié la ligne 32
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cmdUpdate.Parameters("@NewValue").Value = x1
    Pour récupérer le nouveau numéro et non pas L'id de la ligne

    Merci beaucoup de ton aide, ça me permet de comprendre pas mal de chose

    Résolu donc

  9. #9
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2006
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2006
    Messages : 1 816
    Points : 4 164
    Points
    4 164
    Par défaut
    Bonjour splif,

    Oui effectivement j'avais oublié d'ouvrir la connexion, chose que j'ai modifié après

    Petite question, ton paramètre x1 en ligne 32, c'est le même pour toutes les lignes ou tu le calcules à chaque itération?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/09/2009, 14h20
  2. [MySQL] Mise à jours de plusieurs lignes avec mysql
    Par hakou08 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/04/2009, 20h10
  3. Mise à jour de plusieurs ligne dans un UPDATE
    Par sofien dans le forum SQL
    Réponses: 14
    Dernier message: 11/07/2008, 08h26
  4. Réponses: 6
    Dernier message: 29/06/2006, 14h00
  5. Mise à jour de plusieurs tables
    Par NAMORJOSE dans le forum Access
    Réponses: 1
    Dernier message: 19/11/2005, 08h33

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