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

Accès aux données Discussion :

Pb de requetes d'insert dans un datagridview


Sujet :

Accès aux données

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut Pb de requetes d'insert dans un datagridview
    Bonjour,

    j'ai un souci pour construire une requête SQL d'insert. J'ai deux tables dans Access :
    Nom : bdd.jpg
Affichages : 197
Taille : 50,4 Ko

    En rouge la clé primaire de la table, en bleu la clé étrangère, j'aimerais ajouter un lot supplémentaire à un des articles, par exemple le lot 1122 aux articles dont le n° est 1.

    Je présente mes données dans un datagridview, l'ajout de données dans les deux tables est ok mais l'ajout que dans la table lot me pose souci

    Mon code se présente ainsi :
    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
     
     
    Dim CodeArticle As String = InputBox("Pour quel code article ?", "Code article ?")
    Dim Requete As String = "SELECT Num_Article from Article Where Code_Article = '" & CodeArticle & "'"
    Dim Commande As New OleDbCommand(Requete, Connexion)
    NumArticle = Commande.ExecuteScalar()
     
     
    Insert = New OleDbCommand("Insert into Lot (" & DG_DataGrid.Columns(6).Name & "," & DG_DataGrid.Columns(7).Name & "," & DG_DataGrid.Columns(8).Name & "," & DG_DataGrid.Columns(9).Name & "," & DG_DataGrid.Columns(10).Name & ") Select @Date_PerempLot, @Stockage, @Fournisseur, @Date_Reception, @Num_Lot from lot where numéro_Article = @ID", Connexion)
     
     
                        Insert.Parameters.AddWithValue("@Date_PerempLot", DG_DataGrid.CurrentRow.Cells(6).Value)
     
                        Insert.Parameters.AddWithValue("@Stockage", DG_DataGrid.CurrentRow.Cells(7).Value)
     
                        Insert.Parameters.AddWithValue("@Fournisseur", DG_DataGrid.CurrentRow.Cells(8).Value)
     
                        Insert.Parameters.AddWithValue("@Date_Reception", DG_DataGrid.CurrentRow.Cells(9).Value)
     
                        Insert.Parameters.AddWithValue("@Num_Lot", DG_DataGrid.CurrentRow.Cells(10).Value)
     
                        Insert.Parameters.AddWithValue("@ID", NumArticle)
     
                    DataSetAdaptateur.InsertCommand = Insert
     
                    Insert.ExecuteNonQuery()
                    DataSetAdaptateur.Update(DataSet, "DataTableCreation")
                    Insert.Dispose()
                    Connexion.Close()
    J'ai l'erreur : "Modifications non effectuées : risque de doublons dans champs index, clé principale ou relation interdisant les doublons. Modifiez les données des champs contenant les doublons, enlevez ou redéfinissez l’index pour permettre les doublons et recommencez."

    Je suis dessus depuis des heures et je ne vois pas comment m'en tirer

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Bonsoir,

    J'ai l'impression que tu as oublié de spécifier la valeur pour la colonne "Numéro_Article". Si la colonne ne peut contenir la valeur NULL, alors le soucis est peut être là...

    Sinon le message d'erreur fait référence à un risque de doublons. Il nous faut donc connaître toutes les contraintes sur ta table, notamment la clé primaire (bon, ça on là), mais aussi d'éventuelles contraintes d'unicité.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    Bonjour Dorinf,

    J'ai l'impression que tu as oublié de spécifier la valeur pour la colonne "Numéro_Article". Si la colonne ne peut contenir la valeur NULL, alors le soucis est peut être là...
    Non j'ai bien la valeur pour "Numéro_Article", je l'obtiens via ces commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Requete As String = "SELECT Num_Article from Article Where Code_Article = '" & CodeArticle & "'"
    Dim Commande As New OleDbCommand(Requete, Connexion)
    NumArticle = Commande.ExecuteScalar()
    ...
    Insert.Parameters.AddWithValue("@ID", NumArticle)
    Sinon le message d'erreur fait référence à un risque de doublons. Il nous faut donc connaître toutes les contraintes sur ta table, notamment la clé primaire (bon, ça on là), mais aussi d'éventuelles contraintes d'unicité.
    Le null est interdit sur les clés primaires mais également sur la colonne "Code_Article" de Article ; concernant la relation entre les tables :
    Nom : relations tables.JPG
Affichages : 180
Taille : 27,3 Ko

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par rocketter Voir le message
    Non j'ai bien la valeur pour "Numéro_Article", je l'obtiens via ces commandes :
    Tu m'as mal compris. Tu as bien le "Numero_Article" qui apparait dans la clause WHERE, mais pas dans les champs insérés. Aussi, quand tu ajoutes une ligne à la table Lot, la colonne Numero_Article n'est pas initialisée (donc à NULL). Comme ton schéma interdit les NULL, cela provoque une erreur. Je ne sais pas si c'est celle là qui est en cause ici, mais cela fera au moins une erreur de corrigée.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    Oui, au temps pour moi, j'ai modifié la requête dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert = New OleDbCommand("Insert into Lot (" & DG_DataGrid.Columns(6).Name & ", Numéro_article, " & DG_DataGrid.Columns(7).Name & "," & DG_DataGrid.Columns(8).Name & "," & DG_DataGrid.Columns(9).Name & "," & DG_DataGrid.Columns(10).Name & ") values (@Date_PerempLot, @ID, @Stockage, @Fournisseur, @Date_Reception, @Num_Lot)", Connexion)
    Toujours la même erreur Malgré tout l'enregistrement se fait dans la bdd

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Es-tu sûr à 100% que l'enregistrement présent est bien celui que tu as saisies, et non un enregistrement qui existait préalablement ?
    Refais un test avec un numéro de lot n'existant pas (vérifie bien avant de faire ta requête), puis effectue la requête et regarde ce qui se passe. As-tu l'exception ? L'enregistrement est-il présent ?

    Autre piste, serait-il possible que ton code soit appelé plusieurs fois ? Cela pourrait expliquer le problème. Tu peux le vérifier simplement en mettant un point d'arrêt sur la ligne appelant DataSetAdaptateur.Update et vérifier que l'exception se produit bien lors du premier appel.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    Oui oui je confirme, en spécifiant un n° de lot bidon que dans le programme, l'enregistrement apparait dans la base Access, malgré l'erreur.

    Autre piste, serait-il possible que ton code soit appelé plusieurs fois ? Cela pourrait expliquer le problème. Tu peux le vérifier simplement en mettant un point d'arrêt sur la ligne appelant DataSetAdaptateur.Update et vérifier que l'exception se produit bien lors du premier appel.
    Avant d'appuyer sur le bouton "Insertion" ma cnx à la base est fermée, lorsque j'appuie sur ce bouton, la cnx s'ouvre, et ensuite je n'ai que cet update qui est appelé, l'exception est bien levé qu'une seule fois lorsque le programme rencontre la ligne DataSetAdaptateur.Update

  8. #8
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par rocketter Voir le message
    Avant d'appuyer sur le bouton "Insertion" ma cnx à la base est fermée, lorsque j'appuie sur ce bouton, la cnx s'ouvre, et ensuite je n'ai que cet update qui est appelé, l'exception est bien levé qu'une seule fois lorsque le programme rencontre la ligne DataSetAdaptateur.Update
    Ce n'était pas ma question. Je ne te demandais pas si l'exception ne se produisait qu'une seule fois, mais si elle se produisait bien lors du premier appel.

    Je t'invite à mettre un point d'arrêt sur cette ligne. Lorsque tu l’atteins, tu regardes si ta base access contient ou non la ligne. Ensuite, tu continues l'exécution de ton programme afin d'exécuter juste le Update et tu nous dis si tu as eu ou pas une exception. Cela peut te paraître bateau, mais dans la mesure où tu ne fournis pas d'exemple pour pouvoir reproduire le problème, il faut s'assurer qu'il est correctement identifié.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    J'ai mis le point d'arrêt sur la ligne, je lance le programme. Lorsque le programme arrive sur mon point d'arrêt :
    Nom : arret.JPG
Affichages : 136
Taille : 14,6 Ko

    ma bdd possède le nouvel enregistrement.

    je fais F8 et là l'erreur apparait. Donc l'exception apparait au premier appel

    Je ne sais pas si je réponds mieux à ta question. Après fichier d'exemple j'suis pas contre, j'pourrais essayer de bidouiller un truc pour reproduire le pb.

  10. #10
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    *TILT*
    Je n'avais pas vu une chose, mais ce que tu viens de me dire me l'a fait voir. Tu donnes toi-même la réponse : la donnée est présente avant d'exécuter le Update.

    En regardant mieux ton code, c'est à cause du Insert.ExecuteNonQuery() (c'est ça que j'aurais du voir plus tôt).

    Ou bien tu mets le Insert.ExecuteNonQuery(), ou bien le DataSetAdaptateur.Update, mais pas les deux, sinon, tu insères deux fois la donnée, d'où l'erreur que tu rencontres !
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #11
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2013
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 164
    Points : 53
    Points
    53
    Par défaut
    Tu as raison ! du coup l'erreur est logique. Maintenant c'est ok, ce qui est étonnant par contre c'est que j'ai mis ces deux lignes à peu près partout dans mon programme (création d'items, modifications de données) mais je n'ai pas d'erreur et pas de doublon non plus

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

Discussions similaires

  1. Requete d'insertion dans une table
    Par jkamelin dans le forum WinDev
    Réponses: 1
    Dernier message: 28/12/2009, 16h17
  2. insertion dans un DataGridView
    Par gentelmand dans le forum VB.NET
    Réponses: 5
    Dernier message: 27/02/2009, 20h48
  3. [INSERTION DATE] dans requete d'insertion et mysql
    Par vincedjs dans le forum Requêtes
    Réponses: 9
    Dernier message: 03/02/2006, 17h11
  4. Requete insertion dans une table sous delphi?
    Par EssaiEncore dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/01/2006, 15h12
  5. sql update et insert dans la meme requete
    Par Jessicaa dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/12/2005, 15h39

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