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 :

Ajout de données dans une table à partir d'un datagridview


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut Ajout de données dans une table à partir d'un datagridview
    Salut le forum je voudrais à partir d'un datagridview enregistrer les éléments de salaire des employés dans la table salaire
    pour cela j'ai écrit le code suivant:
    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
      For index As Integer = 0 To dgvElementSalaire.RowCount - 1
                cmd.CommandText = "INSERT INTO [SALAIRE] ([EM_ID],[SA_ID],[IDCLIENT],[Date_Debut],[Date_Fin],[MONTANT],[IDNATURE])
    values (@EM_ID,@SA_ID,@IDCLIENT,@Date_Debut,@Date_Fin,@MONTANT,@IDNATURE)"
                cmd.Parameters.AddWithValue("@EM_ID", dgvElementSalaire.Rows(index).Cells(5).Value)
                cmd.Parameters.AddWithValue("@SA_ID", dgvElementSalaire.Rows(index).Cells(7).Value)
                cmd.Parameters.AddWithValue("@IDCLIENT", dgvElementSalaire.Rows(index).Cells(6).Value)
                cmd.Parameters.AddWithValue("@Date_Debut", dtpDateDebut.Value)
                cmd.Parameters.AddWithValue("@Date_Fin", dtpDateFin.Value)
                cmd.Parameters.AddWithValue("@MONTANT", dgvElementSalaire.Rows(index).Cells(4).Value)
                cmd.Parameters.AddWithValue("@IDNATURE", dgvElementSalaire.Rows(index).Cells(8).Value)
     
                Call Connecter()
                cmd.Connection = con
                cmd.ExecuteNonQuery()
                Call deconnecter()
            Next
    mais lors du test je reçois toujours l'erreur suivant:
    Nom : PROBLEMEINSERT.PNG
Affichages : 548
Taille : 16,2 Ko
    et je ne comprend pas ce qui

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,


    Je n'ai pas la même syntaxe que toi pour les paramètres. Peux-tu essayer ceci :

    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
     
     
    ' ...
                Dim Param As OleDbParameter   ' MySqlParameter ou SqlParameter ou ... selon ton SGBD
    ' ...
    Param = New OleDBParameter("@EM_ID", dgvElementSalaire.Rows(index).Cells(5).Value)
    cmd.Parameters.Add(Param)
    Param = New OleDBParameter("@SA_ID", dgvElementSalaire.Rows(index).Cells(7).Value)
    cmd.Parameters.Add(Param)
    Param = New OleDBParameter("@IDCLIENT", dgvElementSalaire.Rows(index).Cells(6).Value)
    cmd.Parameters.Add(Param)
    Param = New OleDBParameter("@Date_Debut", dtpDateDebut.Value)
    cmd.Parameters.Add(Param)
    Param = New OleDBParameter("@Date_Fin", dtpDateFin.Value)
    cmd.Parameters.Add(Param)
    Param = New OleDBParameter("@MONTANT", dgvElementSalaire.Rows(index).Cells(4).Value)
    cmd.Parameters.Add(Param)
    Param = New OleDBParameter("@IDNATURE", dgvElementSalaire.Rows(index).Cells(8).Value)
    cmd.Parameters.Add(Param)
    ' ...

  3. #3
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Bonsoir Phil Rob
    même avec cette commande j'ai la même erreur
    je précise que je suis sous sql server 2014
    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
     
            For index As Integer = 0 To dgvElementSalaire.RowCount - 1
                cmd.CommandText = "INSERT INTO [SALAIRE] ([EM_ID],[SA_ID],[IDCLIENT],[Date_Debut],[Date_Fin],[MONTANT],[IDNATURE])
    values (@EM_ID,@SA_ID,@IDCLIENT,@Date_Debut,@Date_Fin,@MONTANT,@IDNATURE)"
     
                Dim Param As SqlParameter   ' MySqlParameter ou SqlParameter ou ... selon ton SGBD
            ' ...
            Param = New SqlParameter("@EM_ID", dgvElementSalaire.Rows(Index).Cells(5).Value)
            cmd.Parameters.Add(Param)
            Param = New SqlParameter("@SA_ID", dgvElementSalaire.Rows(Index).Cells(7).Value)
            cmd.Parameters.Add(Param)
            Param = New SqlParameter("@IDCLIENT", dgvElementSalaire.Rows(Index).Cells(6).Value)
            cmd.Parameters.Add(Param)
            Param = New SqlParameter("@Date_Debut", dtpDateDebut.Value)
            cmd.Parameters.Add(Param)
            Param = New SqlParameter("@Date_Fin", dtpDateFin.Value)
            cmd.Parameters.Add(Param)
            Param = New SqlParameter("@MONTANT", dgvElementSalaire.Rows(Index).Cells(4).Value)
            cmd.Parameters.Add(Param)
            Param = New SqlParameter("@IDNATURE", dgvElementSalaire.Rows(Index).Cells(8).Value)
            cmd.Parameters.Add(Param)
     
                Call Connecter()
                cmd.Connection = con
                cmd.ExecuteNonQuery()
                Call deconnecter()
            Next
     
            Call RemplirGrid(dgvSalaire, "VVSALAIRE")
            dgvSalaire.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
    Nom : Capture.PNG
Affichages : 728
Taille : 9,7 KoNom : Capture.PNG
Affichages : 728
Taille : 9,7 Ko

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Ok ma réponse n'était pas adaptée ..., je m'en suis rendu compte trop tard

    Pour ce qui est du SGBD, si tu utilises SQL server, tu utilises donc les librairies Sql ... et non les OleDb ... (SqlConnection, SQLCommand, SqlAdapter, ...). Mais ton erreur n'est due au SGBD.

    En relisant ton code, je pense qu'il te faut sortir la ligne SQl de la boucle, si on pourquoi utiliser des paramètres ... vu que dans la boucle, tu peux passer directement les valeurs à la requête, pour chaque exécution, une à la fois.

    Si cela ne fonctionne pas avec le code suivant, nous essayerons sans paramètres (si cela peut te convenir).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                cmd.CommandText = "INSERT INTO [SALAIRE] ([EM_ID],[SA_ID],[IDCLIENT],[Date_Debut],[Date_Fin],[MONTANT],[IDNATURE])
    values (@EM_ID,@SA_ID,@IDCLIENT,@Date_Debut,@Date_Fin,@MONTANT,@IDNATURE)"
     
    For index As Integer = 0 To dgvElementSalaire.RowCount - 1
     
    ' ici peut venir ton code des paramètres, ou bien le mien si le tien ne marche pas
    ' ...

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Deux solutions :

    1/ La solution pourrie : ajoute un cmd.Parameters.Clear() au début de ton FOR

    2/ La solution plus performante : déclare ta requête et tes paramètres avant le FOR, puis change simplement les .Value de tes paramètres à l'intérieur du FOR

  6. #6
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Bonsoir StringBuilder
    j'ai déclarer les variables
    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
    Dim command As New Data.SqlClient.SqlCommand
            con.ConnectionString = "Data Source=.\SQLEXPRESS;Initial Catalog=GESTIONPETROLE;Integrated Security=True"
            command.CommandText = "INSERT INTO [SALAIRE] ([EM_ID],[SA_ID],[IDCLIENT],[Date_Debut],[Date_Fin],[MONTANT],[IDNATURE])
    values (@EM_ID,@SA_ID,@IDCLIENT,@Date_Debut,@Date_Fin,@MONTANT,@IDNATURE)"
     
            command.Parameters.Add("@EM_ID", SqlDbType.Int)
            command.Parameters.Add("@SA_ID", SqlDbType.Int)
            command.Parameters.Add("@IDCLIENT", SqlDbType.Int)
            command.Parameters.Add("@Date_Debut", SqlDbType.DateTime)
            command.Parameters.Add("@Date_Fin", SqlDbType.DateTime)
            command.Parameters.Add("@MONTANT", SqlDbType.Decimal)
            command.Parameters.Add("@IDNATURE", SqlDbType.Int)
            con.Open()
            command.Connection = con
            command.Parameters.Clear()
     
            For i As Integer = 0 To dgvElementSalaire.Rows.Count - 1
                command.Parameters(0).Value = dgvElementSalaire.Rows(i).Cells(5).Value
                command.Parameters(1).Value = dgvElementSalaire.Rows(i).Cells(7).Value
                command.Parameters(2).Value = dgvElementSalaire.Rows(i).Cells(6).Value
                command.Parameters(3).Value = dtpDateDebut.Value
                command.Parameters(4).Value = dtpDateFin.Value
                command.Parameters(5).Value = dgvElementSalaire.Rows(i).Cells(4).Value
                command.Parameters(6).Value = dgvElementSalaire.Rows(i).Cells(8).Value
     
                command.ExecuteNonQuery()
            Next
    lors du test les premières valeurs son bien ajouter mais au second chargement, j'obtiens l'erreur suivant:
    Nom : Captures.PNG
Affichages : 485
Taille : 9,4 Ko

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    La formule est plaisante. Mais command.Parameters.Clear() vide la collection des paramètres que tu viens de créer. Je pense que cette ligne devrait se trouver avant les "Parameters.Add ... ".

    Je reste à ta disposition pour écrire les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "INSERT INTO [SALAIRE] ([EM_ID],[SA_ID],[IDCLIENT],[Date_Debut],[Date_Fin],[MONTANT],[IDNATURE])
    values (@EM_ID,@SA_ID,@IDCLIENT,@Date_Debut,@Date_Fin,@MONTANT,@IDNATURE)"
    sans utiliser les paramètres.

    A bientôt,

  8. #8
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Phil Rob Voir le message
    Je reste à ta disposition pour écrire les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "INSERT INTO [SALAIRE] ([EM_ID],[SA_ID],[IDCLIENT],[Date_Debut],[Date_Fin],[MONTANT],[IDNATURE])
    values (@EM_ID,@SA_ID,@IDCLIENT,@Date_Debut,@Date_Fin,@MONTANT,@IDNATURE)"
    sans utiliser les paramètres.
    J'ai pas compris ce que ça voulais dire ça ?

    Il ne faut jamais utiliser de requête non paramétrée : c'est contre performant et la porte ouverte aux injections SQL.

  9. #9
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    Bonjour Phil Rob, bonjour StringBuilder
    effectivement il fallait mettre cmd.parameters.clear avant la création de mes paramètres donc sa marche.
    Mai j'ai une autre question
    j'aurais bien voulut qu'après un enregistrement que ce message s'affiche 'MsgBox("Ajout effectué avec succés")'
    il est bien dans mon code il mais il ne s'affiche pas après insertion
    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
            Try
     
                Call Connecter()
                cmd.Connection = con
                If cmbNom.Text = "" Then
                    MsgBox("Champ Nom obligatoire", MsgBoxStyle.Critical, "Attention")
                    cmbNom.Focus()
                    Exit Sub
                End If
                cmd.CommandText = "INSERT INTO [SALAIRE] ([EM_ID],[SA_ID],[IDCLIENT],[Date_Debut],[Date_Fin],[MONTANT],[IDNATURE])
    values (@EM_ID,@SA_ID,@IDCLIENT,@Date_Debut,@Date_Fin,@MONTANT,@IDNATURE)"
                cmd.Parameters.Clear()
                dgvElementSalaire.Refresh()
                cmd.Parameters.Add("@EM_ID", SqlDbType.Int)
                cmd.Parameters.Add("@SA_ID", SqlDbType.Int)
                cmd.Parameters.Add("@IDCLIENT", SqlDbType.Int)
                cmd.Parameters.Add("@Date_Debut", SqlDbType.DateTime)
                cmd.Parameters.Add("@Date_Fin", SqlDbType.DateTime)
                cmd.Parameters.Add("@MONTANT", SqlDbType.Decimal)
                cmd.Parameters.Add("@IDNATURE", SqlDbType.Int)
                For i As Integer = 0 To dgvElementSalaire.Rows.Count - 1
                    cmd.Parameters(0).Value = dgvElementSalaire.Rows(i).Cells(5).Value
                    cmd.Parameters(1).Value = dgvElementSalaire.Rows(i).Cells(7).Value
                    cmd.Parameters(2).Value = dgvElementSalaire.Rows(i).Cells(6).Value
                    cmd.Parameters(3).Value = dtpDateDebut.Value
                    cmd.Parameters(4).Value = dtpDateFin.Value
                    cmd.Parameters(5).Value = dgvElementSalaire.Rows(i).Cells(4).Value
                    cmd.Parameters(6).Value = dgvElementSalaire.Rows(i).Cells(8).Value
     
                    cmd.ExecuteNonQuery()
     
                Next
                Call deconnecter()
                MsgBox("Ajout effectué avec succés")
     
            Catch ex As Exception
     
            End Try
    je ne comprend pas pourquoi le message n'affiche pas?

  10. #10
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Regarde en debug si tu vas pas dans ton catch par hasard.

  11. #11
    Membre éclairé
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Par défaut
    je ne comprend pas bien se que vous me demander de faire pouvez vous être plus précis?

  12. #12
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    En ne regardant que la première phase du message d'erreur, je pense que tu as un ou plusieurs champs numériques dans la DB et que ces données passées sous forme de chaines ne sont pas dans le bon format.
    Par exemple, une virgule au lieu d'un point comme séparateur décimal, un ou plusieurs espaces dans la chaine (passer les chaines "numériques" par Trim() pour enlever les espaces en début et en fin de chaine), format numérique non conforme à celui de la DB (Int32 <==> Int64, par exemple).

    A voir ...

  13. #13
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    C'est une des raisons pour lesquelles il ne faut jamais utiliser des requêtes "ad hoc", mais toujours des requêtes paramétrées.

    Pourquoi as-tu enlevé la gestion des paramètres ?

    Ils sont là pour justement contrôler que tu passes le bon type de données aux différentes colonnes.

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

Discussions similaires

  1. Ajouter données dans une table à partir d'un formulaire
    Par Alex1407 dans le forum Macros Access
    Réponses: 0
    Dernier message: 12/06/2013, 15h46
  2. Réponses: 5
    Dernier message: 26/01/2007, 08h11
  3. Enregistrer des données dans une table à partir du code
    Par Ragnarok85 dans le forum Access
    Réponses: 4
    Dernier message: 24/01/2007, 13h03
  4. Réponses: 14
    Dernier message: 22/09/2005, 16h49
  5. Réponses: 2
    Dernier message: 15/06/2005, 17h32

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