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


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    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 expérimenté
    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
    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 expérimenté
    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

    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
    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 :


  7. #7
    Modérateur

    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
    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

    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?