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

C++Builder Discussion :

problème dans une requête d'insertion


Sujet :

C++Builder

  1. #1
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut problème dans une requête d'insertion
    Bonjour,

    je veux insérer dans ma table des enregistrements dont les valeurs des champs proviennent des zones d'éditions, pour cela j'ai utilisé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Query1->Close();
     Query1->SQL->Clear();
    Query1->SQL->Add("insert into MaTble ");
    Query1->SQL->Add("(Champ1,Champ2) ");
    Query1->SQL->Add("Values( '+ Edit1->Text +' ,  '+ Edit1->Text + ')");
     Query1->ExecSQL();
    vue que mes champs sont des chaine de caractères de taille 5, ce code m'insère l'enregistrement (Edit1,Edit2), alors que je veux qu'il m'insère leurs contenus

    et quand j'ai remplacé la 5eme ligne du code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Query1->SQL->Add("Values( '"+ Edit1->Text +"' ,  '"+ Edit1->Text + "')");
    je reçoit un avertissement "violation de clé" lors de l'exécution.

    est ce que vous pouvez m'aider là-dessus?

    merci d'avance.

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Salut,
    aurais tu le message complet de ta violation de clef ?
    Moi ça me fait pensé à un champs que tu aurais mis en incrément automatique et que tu essayé quand même de lui donner une valeur dans ton insert, ou alors un champs dans la valeur doit être unique (clef primaire) et dont tu essaye d'entré une valeur qui existe déjà dans la table.

  3. #3
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    salut,
    merci pottiez pour la réponse vite, ci joint le message d'erreur que j'ai eu.
    je rappelle que les champs sont des string, il n'existe pas un champ auto.

    merci d'avance

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Salut,
    est-ce que tu pourrait mettre la structure exacte de ta table MaTble, éventuellement également les données qui sont dedans et les valeur des champs Edit1 et Edit2 ?

  5. #5
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    salut,

    le bouton contient le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Form1->Query1->Close();
     
    Form1->Query1->SQL->Clear();
    Form1->Query1->SQL->Add("insert into Etudiant ");
    Form1->Query1->SQL->Add("(Code_Etud,Nom_Etud,Prenom_Etud,Adress_Etud) ");
    Form1->Query1->SQL->Add("Values( '"+ Edit1->Text +"' ,  '"+ Edit2->Text +" ', '"+ Edit3->Text + "', '"+ Edit4->Text + "')");
    Form1->Query1->ExecSQL();
    et je fais entrer ces valeurs dans les zones d'édition respectives dans mon interface:
    Edit1->Text= E1235
    Edit2->Text= bill
    Edit3->Text= JOCHMANS
    Edit4->Text=paris

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    pottiez a raison

    la strucutre serait la bienvenue

    c est pas une question de type envoyé dans un type qui correspond pas ?

  7. #7
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    salut cedni et merci
    Citation Envoyé par cedni Voir le message

    c est pas une question de type envoyé dans un type qui correspond pas ?
    Non, d'ailleurs les champs sont tous de type chaine, en plus je ne fais qu'insérer des chaines, j'ai essayé le même code avec les valeurs directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form1->Query1->SQL->Add("Values( 'E1235' ,  'bill', ' JOCHMANS', 'paris')");
    et ça a marché.

    merci pour votre aide

  8. #8
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Salut, est-ce que le code avec les valeurs directement tu l'as essayé avant ou après le code avec les Edit ?

    Si tu utilise le code avec les Edit et que tu met d'autre valeur que celle déjà enregistré dans la base, cela fonctionne ou non ?

  9. #9
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    salut
    Citation Envoyé par pottiez Voir le message
    Salut, est-ce que le code avec les valeurs directement tu l'as essayé avant ou après le code avec les Edit ?
    il marche dans les deux cas, que ce soit avant ou après l'utilisation du code des Edit.

    Si tu utilise le code avec les Edit et que tu met d'autre valeur que celle déjà enregistré dans la base, cela fonctionne ou non ?
    oui je comprend ce que vous voulez dire, je reçoit le même message d'erreur, même en changeant les valeurs déjà enregistré, la violation ici n'est pas due à l'ajout d'un enregistrement dont la clef existe déjà, j'ai essayé par exemple ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->Query1->SQL->Add("Values( 'eeeee' ,  '"+ Edit2->Text +" ', '"+ Edit3->Text + "', '"+ Edit4->Text + "')");
    il m'insère que le 1er champ 'eeeee', et le reste est vide.

    merci pour votre aide.

  10. #10
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Je pense savoir d'où vient le problème, il arrive que la concaténation avec des propriété ne se passe pas correctement, essayez 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
    Form1->Query1->Close();
     
    Form1->Query1->SQL->Clear();
    Form1->Query1->SQL->Add("insert into Etudiant ");
    Form1->Query1->SQL->Add("(Code_Etud,Nom_Etud,Prenom_Etud,Adress_Etud) ");
    AnsiString requete = "Values( '"+ Edit1->Text;
    requete += "' ,  '"+ Edit2->Text;
    requete += " ', '"+ Edit3->Text;
    requete += "', '"+ Edit4->Text;
    requete += "')";
    Form1->Query1->SQL->Add(requete);
    Form1->Query1->ExecSQL();

  11. #11
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    salut,

    je reçois le même message d'erreur

  12. #12
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Citation Envoyé par SmileSoft Voir le message
    oui je comprend ce que vous voulez dire, je reçoit le même message d'erreur, même en changeant les valeurs déjà enregistré, la violation ici n'est pas due à l'ajout d'un enregistrement dont la clef existe déjà, j'ai essayé par exemple ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->Query1->SQL->Add("Values( 'eeeee' ,  '"+ Edit2->Text +" ', '"+ Edit3->Text + "', '"+ Edit4->Text + "')");
    il m'insère que le 1er champ 'eeeee', et le reste est vide.
    Je trouve bizard qu'il commence un enregistrement d'un insert et ne le fini pas, normalement, soit une commande est valide et il l'exécute en entier, soit elle est invalide et ne l'exécute pas du tout

  13. #13
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    salut,
    oui, tout à fait , en fait je vide les Edit au début du code mais je pense pas qu'il ne les prend pas en considération pour cette raison , j'ai déplacé le 'eeeee'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->Query1->SQL->Add("Values( '"+ Edit1->Text +"' ,  'eeeee ', '"+ Edit3->Text + "', '"+ Edit4->Text + "')");
    et je reçois le même message, le problème se pose pour le champ clé primaire qui est Code_Etud.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Ok il me semble avoir dejà eu ce probleme

    en fait il faut passer des String au lieu des Edit1->Text

    voici un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    String Vref = Edit1->Text;
    String Vdescrip = Edit2->Text;
    String Vnom = Edit3->Text;
     
     
    String myQuery = "INSERT INTO articles(ref,descrip,nombre) VALUES ('"+Vref+"','"+Vdescrip+"','"+Vnom+"')";
     
     
    //String myQuery = "INSERT INTO articles(ref,descrip,nombre)  VALUES ('999987','zzz987','9987654')";
     
    SQLQuery1->SQL->Clear();
    SQLQuery1->SQL->Text = myQuery;
    SQLQuery1->ExecSQL(false);
    normalement comme çà c est bon

  15. #15
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Si tu les vide effectivement il peut y avoir un problème si ta table est configuré pour ne pas accepter les champs NULL, quoique normalement le SGBD doit faire la différence entre vide est NULL et devrait quand même les entrer, tu peut montrer le code de toute ta fonction, quel est l'intérêt de les vider puis de rentrer leurs valeurs (qui sera vide à moins que tu les re-remplisse entre deux) dans la base ?

  16. #16
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    salut
    Citation Envoyé par pottiez Voir le message
    Si tu les vide effectivement il peut y avoir un problème si ta table est configuré pour ne pas accepter les champs NULL, quoique normalement le SGBD doit faire la différence entre vide est NULL et devrait quand même les entrer, tu peut montrer le code de toute ta fonction, quel est l'intérêt de les vider puis de rentrer leurs valeurs (qui sera vide à moins que tu les re-remplisse entre deux) dans la base ?
    effectivement l'erreur été dans les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Edit1->Text="";
     Edit2->Text="";
     Edit3->Text="";
     Edit4->Text="";
    en exécutant mon ex code j'ai eu un avertissement utilisation incorrecte du champ..., mais avec le code que vous m'avais proposé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Form1->Query1->Close();
     
    Form1->Query1->SQL->Clear();
    Form1->Query1->SQL->Add("insert into Etudiant ");
    Form1->Query1->SQL->Add("(Code_Etud,Nom_Etud,Prenom_Etud,Adress_Etud) ");
    AnsiString requete = "Values( '"+ Edit1->Text;
    requete += "' ,  '"+ Edit2->Text;
    requete += " ', '"+ Edit3->Text;
    requete += "', '"+ Edit4->Text;
    requete += "')";
    Form1->Query1->SQL->Add(requete);
    Form1->Query1->ExecSQL();
    elle marche très bien , merci beaucoup c'est bien résolu

  17. #17
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Un petit conseil hors sujet sur les requêtes SQL :

    Une bonne habitude à prendre est d'utiliser QuotedStr pour les chaine de caractère dans les requête, plutôt que de manipuler des apostrophe (').

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AnsiString requete = "Values( "
                      + QuotedStr( Edit1->Text ) + " , "
                      + QuotedStr( Edit2->Text ) + " , "
                      + QuotedStr( Edit3->Text ) + " , "
                      + QuotedStr( Edit4->Text ) + " ) " ;
    QuotedStr se charge d'ajouter les quotes au début, à la fin, mais également de doubler les quotes se trouvant dans la chaîne de caractère.

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

Discussions similaires

  1. problème dans une requête INSERT
    Par xavier81 dans le forum Développement
    Réponses: 1
    Dernier message: 06/03/2011, 11h37
  2. Problème dans une requête d'insertion
    Par celica dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 19/09/2007, 15h28
  3. [Access] Problème dans une requête SQL avec INNER JOIN ?
    Par bds2006 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/06/2006, 10h57
  4. Problème dans une requête SQL avec AS et ON ?
    Par bds2006 dans le forum Bases de données
    Réponses: 9
    Dernier message: 26/06/2006, 15h25
  5. problème dans une requête
    Par pierrOPSG dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/11/2005, 10h28

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