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 :

Probleme de conflit avec une clé etrangere


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 31
    Points : 12
    Points
    12
    Par défaut Probleme de conflit avec une clé etrangere
    bonjour
    je suis entrain de realiser une application winform avec c# et sql server j'ai un probleme de conflit avec la clé etrangére
    je vais inserer un produit qui a une clé etrangére vers une table famille et une table fournisseur
    produit(id,nom,quantité,fournisseur,#idfamille,#idfournisseur)
    fournisseur(id,intitule)
    famille(id,marque,categorie)
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     cmd.CommandText = "insert into produit(id,nom,quantité,fournisseur,famille,fournisseur) SELECT  '" + id.Text + "','" + nom.Text + "','"  + quantite.Text + "','" + famille.combobox1.selectedValue+ "','" + fournisseur.combobox2.selectedValue+ "'  FROM produit,fournisseur,famille WHERE produit.idfamille=famille.id AND produit.idfournisseur=fournisseur.id"
       cmd.ExecuteNonQuery();

    mais lors de l'execution il m'affiche ce message d'erreur L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY "FK_produit_famille ". Le conflit s'est produit dans la base de données "bd", table "dbo.famille", column 'id'. L'instruction a été arrêtée.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Ceci relève plus d'un problème d'instruction SQL qu'un problème de C#.

    Ton instruction d'insertion SQL est totalement erronée...

    Visiblement, tu veux insérer une nouvelle ligne dans ta table "produit" mais tu met un "select" à la fin de ton instruction "insert". Quand tu mets un "select" à la fin de ton instruction "insert", c'est pour dire d'insérer des enregistrements dont les données proviennent d'autres tables de ta base de données qui n'ont rien à voir avec des champs saisis dans une interface.

    La bonne syntaxe à utiliser dans l'occurrence est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into produit(id,nom,quantité,fournisseur,famille,fournisseur)
    VALUES (...
    et là je te laisse finir avec ce qui convient. Mais cela fait partie des fondamentaux de la syntaxe SQL.

    De plus, il faudrait idéalement que tu utilises un objet "DbParameter" pour éviter d'avoir aussi à penser à doubler tes "quotes" s'il y en a dans tes valeurs à insérer!

    Il faudrait que tu apprennes un minimum sur les bases de données... Si tu fais une recherche sur Google avec les mots clés "SYNTAXE SQL INSERT" par exemple, tu peux tomber sur des pages comme celle-ci par exemple...

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    En vrac :
    • Il est préférable (pour le pourquoi, c'est indiqué partout sur le forum) d'utiliser les requêtes paramétrées (c'est du vb mais bon... ça se traduit)
    • Il faut rester cohérent entre le types des valeurs insérées et les types de données des colonnes dans lesquelles on insère

    J'imagine que la colonne id est de type numérique (int ?). Dans ton ordre d'insertion, tu l'entoure d'apostrophe. Ce qui définit une chaîne de caractère...
    Mais ce problème se résoud tout seul à partir du moment où vous utilisez des requêtes paramétrées.

    • Contrairement à ce qu'à dit Ph_Gr, la syntaxe INSERT INTO MATABLE(COL1,COL2) SELECT VAL1,VAL2 [FROM UNEAUTRETABLE [WHERE ...]] est tout à fait valide (qu'il aille donc apprendre les bases du language SQL comme il le suggère).
    • Par contre, rien n'assure que la requête que vous indiquez est correcte. Nous ne connaissons pas votre modèle de données.
    • Vous semblez faire des jointures dans la clause WHERE. Utilisez donc les clauses JOIN. Le résultat est le même mais la lecture de la requête en est facilitée.
    • Concernant le message d'erreur pour lequel vous écrivez, d'après ce que vous donnez comme info, vous tentez d'insérer une ligne dans la table produit avec un id de famille qui n'existe pas dans la table famille.
    Kropernic

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour Kropernic,
    Citation Envoyé par Kropernic Voir le message
    [*]Contrairement à ce qu'à dit Ph_Gr, la syntaxe INSERT INTO MATABLE(COL1,COL2) SELECT VAL1,VAL2 [FROM UNEAUTRETABLE [WHERE ...]] est tout à fait valide (qu'il aille donc apprendre les bases du language SQL comme il le suggère).
    Excuses-moi mais tu déformes mes propos. Je n'ai jamais dit que cette syntaxe n'était pas valide, là tu as interprété mon propos. Je sais que cette syntaxe existe mais elle ne correspond pas à l'usage fait.

    D'ailleurs je l'avais bien précisé ici :
    Visiblement, tu veux insérer une nouvelle ligne dans ta table "produit" mais tu met un "select" à la fin de ton instruction "insert". Quand tu mets un "select" à la fin de ton instruction "insert", c'est pour dire d'insérer des enregistrements dont les données proviennent d'autres tables de ta base de données qui n'ont rien à voir avec des champs saisis dans une interface.
    Donc je connais bien mes bases SQL. Je ne dirai pas par contre que tu ne comprends pas le français mais plutôt que tu as lu un peu vite...

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par Ph_Gr Voir le message
    Bonjour Kropernic,

    Excuses-moi mais tu déformes mes propos. Je n'ai jamais dit que cette syntaxe n'était pas valide, là tu as interprété mon propos. Je sais que cette syntaxe existe mais elle ne correspond pas à l'usage fait.

    D'ailleurs je l'avais bien précisé ici :


    Donc je connais bien mes bases SQL. Je ne dirai pas par contre que tu ne comprends pas le français mais plutôt que tu as lu un peu vite...
    Je me suis laissé emporter. Je m'en excuse. On a tous des jours avec et des jours sans.

    Le reste de mes remarques reste cependant valide.
    Kropernic

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Je me suis laissé emporter. Je m'en excuse. On a tous des jours avec et des jours sans.
    Bien évidemment moi aussi j'en fait des erreurs, l'important c'est de les reconnaître D'ailleurs c'est vrai que je me suis un peu laissé emporté aussi sur "apprendre les bases du langage SQL" alors je m'excuse auprès d'amani.

    Citation Envoyé par Kropernic Voir le message
    Le reste de mes remarques reste cependant valide.
    Absolument et évidemment!

  7. #7
    Membre à l'essai
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    on ne peut pas utiliser insert into select avec values c'est ce que je viens de conclure j'ai essayer de changer la requete comme suit

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    nsert into produit SELECT id,nom,quantité,fournisseur,famille,fournisseur FROM produit ,fournisseur WHERE produit.idfamille=famille.id AND produit.idfournisseur=fournisseur.id
    ce message d'erreur s'affiche
    L'identificateur en plusieurs parties "famille.id" ne peut pas être lié.
    L'identificateur en plusieurs parties "produit.idfamille" ne peut pas être lié.
    L'identificateur en plusieurs parties "produit.idfournisseur" ne peut pas être lié.
    L'identificateur en plusieurs parties "fournisseur.id" ne peut pas être lié.

    je comprend pas le probleme ou exactement

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par amani1 Voir le message
    on ne peut pas utiliser insert into select avec values c'est ce que je viens de conclure
    Eh bien oui, c'est exactement ce qu'on te dit depuis le début.

    Citation Envoyé par amani1 Voir le message
    je comprend pas le probleme ou exactement
    La bonne syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into produit(id,nom,quantité,idfamille,idfournisseur)
    VALUES(1,'Mon produit',5,1,2)
    Ce qui signifie par exemple que là j'insère une ligne dans la table produit dont :
    - id vaut 1
    - nom vaut 'Mon produit'
    - quantité vaut 5
    - idfamille vaut 1 (la valeur de clé 1 doit exister dans la table famille)
    - idfournisseur vaut 2 (la valeur de clé 2 doit exister dans la table fournisseur)


    Maintenant à toi d'appliquer les conseils qu'on te donne et de potasser ce qu'il faut...

  9. #9
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    Dans ta requête
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into produit 
    SELECT id,nom,quantité,fournisseur,famille,fournisseur 
    FROM produit ,fournisseur 
    WHERE produit.idfamille=famille.id AND produit.idfournisseur=fournisseur.id

    tu as l'erreur "L'identificateur en plusieurs parties "famille.id" ne peut pas être lié." car tu appelles l'id de la table "famille" qui n'est pas présent dans ton from

    les autres erreurs en découlent.

    Vois plutôt ta requête comme ceci
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id,nom,quantité,fournisseur,famille,fournisseur -- ne pas oublier de mettre le nom ou l'alias de ta ou tes tables devant les noms de champ, attention aussi fournisseur en double
    FROM produit 
    JOIN fournisseur ON produit.idfournisseur=fournisseur.id
    JOIN famille ON produit.idfamille=famille.id 
    WHERE produit.idfamille=famille.id AND produit.idfournisseur=fournisseur.id

    utilise des LEFT JOIN ou RIGHT JOIN si tu veux aussi récupérer des valeurs null (qui n'existent pas) dans tes tables fournisseur et/ou famille

    Pour l'insert ce sera pour le coup :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ISNERT INTO produit (id,nom,quantité,fournisseur,famille,fournisseur) 
    SELECT id,nom,quantité,fournisseur,famille,fournisseur 
    FROM produit
    JOIN fournisseur on produit.idfournisseur=fournisseur.id
    JOIN famille on produit.idfamille=famille.id 
    WHERE produit.idfamille=famille.id AND produit.idfournisseur=fournisseur.id

    autre chose, il faut éviter les caractères accentués sur les noms de tables, de champs dans une BDD.

Discussions similaires

  1. probleme avec une clé etrangere
    Par tastika dans le forum JPA
    Réponses: 2
    Dernier message: 23/03/2009, 20h51
  2. Réponses: 1
    Dernier message: 25/09/2006, 10h18
  3. Réponses: 4
    Dernier message: 29/07/2005, 11h59
  4. [System][EXEC] Probleme d'execution avec une commande parametrée.
    Par chicorico dans le forum Général Java
    Réponses: 15
    Dernier message: 20/05/2005, 15h07
  5. Réponses: 14
    Dernier message: 09/08/2004, 13h42

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