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

Bases de données Delphi Discussion :

la commande sql ne se termine pas correctement


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Points : 62
    Points
    62
    Par défaut la commande sql ne se termine pas correctement
    bonjour tt le monde
    voici mon code (je ne trouve aucune erreur) ,mais il affiche le message là dessus :
    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
    with SqlQuery1 do
        begin
          Close;
         with Sql do
          begin
            Clear;
            if (cree=false) then
            begin
            Add('INSERT INTO commande(numero) ');
            add('values ('' '+edit1.Text+' '' )');
            cree:=true;
            end;
    Add('INSERT INTO lot(numero,designation,nom_dir,reference,quantite,');
    add('prix_unitaire,prix_total,annee,numero_cmd)');
    add('values ( '+edit4.Text);
    add(','' '+edit5.text+' '' ');
    add(','' '+ComboBox1.Text+' '' ');
    add(','' '+edit6.Text+' ''');
    add(','+edit7.Text);
    add(','+edit8.Text);
    add(','+edit9.Text);
    add(','+annee.ComboBox1.Text);
    add(','' '+edit1.Text+' '')');
     
        end;
     
           Try
            ExecSql;
          except
            on e: Exception do
              showmessage('  *** pb_insert '+ e.Message);
          end;
        end; // with SqlQuery1
     
    end;
    je vous remerci d'avance pour vos reponses

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Utilises des QuotedStr pour construire ton SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Add('INSERT INTO lot(numero,designation,nom_dir,reference,quantite,');
    Add('prix_unitaire,prix_total,annee,numero_cmd)');
    Add('values ( ' + edit4.Text + ',');
    Add(QuotedStr(edit5.text)+ ',');
    Add(QuotedStr(ComboBox1.Text + ',');
    Add(QuotedStr(edit6.Text + ',');
    Add(edit7.Text + ',');
    Add(edit8.Text + ',');
    Add(edit9.Text + ',');
    Add(annee.ComboBox1.Text + ',');
    Add(QuotedStr(edit1.Text) + ')');
    QuotedStr délimite la chaine avec des apostrophes et double également les apostrophes contenues dans la chaine. Ce qui pourrait se produire pour le champ désignation par exemple.

    Une autre solution est d'utiliser une requête paramétrée.

    Un conseil: évite de nommer tes contrôles Edit1, Edit2, ComboBox1... Donne des noms plus explicites, cela facilite la lecture du code ainsi que sa maintenance.

    @+ Claudius

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    j'ai l'impression que la requete n° 1 (INSERT INTO COMMANDE) n'est pas effacée
    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
    with SqlQuery1 do
        begin
          Close;
         with Sql do
          begin
            Clear;
            if (cree=false) then
            begin
            Add('INSERT INTO commande(numero) ');
            add('values ('' '+edit1.Text+' '' )');
            cree:=true;
            end;
    // ICI JE RAJOUTERAIS UN CLEAR;
    
            Add('INSERT INTO lot(numero,designation,nom_dir,reference,quantite,');
    //............
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Comme le dit SergioMaster tu as deux commande dans un query
    il faut les exécuter une à une car un query n'est pas un exécuterur de script mais de requête.

    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
    with SqlQuery1 do
        begin
          Close;
         with Sql do
          begin
            Clear;
            if (cree=false) then
            begin
            Add('INSERT INTO commande(numero) ');
            add('values ('' '+edit1.Text+' '' )');
            cree:=true;
            // ICI UN EXECSQL;
            execsql;
            // ICI JE RAJOUTERAIS UN CLEAR;
            clear;
            end;
            // Ensuite tu peux enchaîner sur ta seconde requête
            Add('INSERT INTO lot(numero,designation,nom_dir,reference,quantite,');
    //............
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Points : 62
    Points
    62
    Par défaut
    merci tous pour vos reponses
    vous avez raison, maintenant il marche

  6. #6
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Yurck Voir le message
    Comme le dit SergioMaster tu as deux commande dans un query
    il faut les exécuter une à une car un query n'est pas un exécuterur de script mais de requête.
    Ca dépend du SGBD qui est derrière. Avec SQL Server et ADO, tu peux parfaitement mettre plusieurs statements dans une même requête.
    C'est même recommandé car dans ce cas, tu gagnes en performance (le batch est envoyé au serveur en une seule fois) et toutes les commandes s'exécutent automatiquement dans une seule et unique transaction.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Points : 62
    Points
    62
    Par défaut
    je rencontre maintenant le même problème, pourtant j'ai fait clear,voici le code
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    if(cree=true) then
     begin
      with SqlQuery1 do
        begin
          Close;
          with Sql do
          begin
            Clear;
    Add('update commande');
    add('set designation='' '+edit2.text+' '' ');
    add(',nom_dir ='' '+ComboBox1.Text+' '' ');
    add(',type ='' '+Combobox2.Text+' ''');
    if edit3.Text='' then  add(',dates=NULL ')
    else add(',dates='' '+edit3.Text+' '' ');
    add(',etat='+inttostr(a));
    add(',annee='+annee.ComboBox1.Text);
    add('set nombre_lot='+inttostr(nbrlot));
    add('where numero='' '+edit1.Text+' '' and annee='+annee.ComboBox1.Text);
      end;//with sql
      execsql;
      cree:=false;
          end;//with sqlquery1
          end //if cree=true
    else
     begin
     with SqlQuery1 do
        begin
          Close;
          with Sql do
          begin
            Clear;
     
    Add('INSERT INTO commande(numero,designation,dates,type,etat,nom_dir,montant,quantite,annee,nombre_lot');
    Add('VALUES ('''+edit1.Text+'''');
    add(','' '+edit2.text+' '' ');
    if edit3.Text='' then  add(',dates=NULL ')
    else add(','' '+edit3.Text+' '' ');
    add(','' '+Combobox2.Text+' ''');
    add(','+inttostr(a));
    add(','' '+ComboBox1.Text+' '' ');
    add(','+edit10.Text);
    add(','+edit11.Text);
    add(','+annee.ComboBox1.Text);
    add(','+inttostr(nbrlot)+')');
      end;  //with sql
      execsql;
          end; //with sqlquery1
          end; //if cree=false

  8. #8
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Points : 62
    Points
    62
    Par défaut la commande sql ne se termine pas correctement
    rebonjour
    j'ai rencontré ce problème, et je ne sais pas où est l'erreur, malgré j'ai utilisé "clear', voici le code

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    if(cree=true) then
     begin
      with SqlQuery1 do
        begin
          Close;
          with Sql do
          begin
            Clear;
    Add('update commande');
    add('set designation='' '+edit2.text+' '' ');
    add(',nom_dir ='' '+ComboBox1.Text+' '' ');
    add(',type ='' '+Combobox2.Text+' ''');
    if edit3.Text='' then  add(',dates=NULL ')
    else add(',dates='' '+edit3.Text+' '' ');
    add(',etat='+inttostr(a));
    add(',annee='+annee.ComboBox1.Text);
    add('set nombre_lot='+inttostr(nbrlot));
    add('where numero='' '+edit1.Text+' '' and annee='+annee.ComboBox1.Text);
      end;//with sql
      execsql;
      cree:=false;
          end;//with sqlquery1
          end //if cree=true
    else
     begin
     with SqlQuery1 do
        begin
          Close;
          with Sql do
          begin
            Clear;
     
    Add('INSERT INTO commande(numero,designation,dates,type,etat,nom_dir,montant,quantite,annee,nombre_lot');
    Add('VALUES ('''+edit1.Text+'''');
    add(','' '+edit2.text+' '' ');
    if edit3.Text='' then  add(',dates=NULL ')
    else add(','' '+edit3.Text+' '' ');
    add(','' '+Combobox2.Text+' ''');
    add(','+inttostr(a));
    add(','' '+ComboBox1.Text+' '' ');
    add(','+edit10.Text);
    add(','+edit11.Text);
    add(','+annee.ComboBox1.Text);
    add(','+inttostr(nbrlot)+')');
      end;  //with sql
      execsql;
          end; //with sqlquery1
          end; //if cree=false
    et merci d'avance

  9. #9
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Tu aurais au moins pu localiser le pb .... c'est l'update ou l'insert ?

    Ensuite, dans le sql d'update, tu as 2 fois l'ordre SET.

    Enfin, au lieu de farcir le code avec des quotes, utilise QuotedStr, ou mieux encore des paramètres. ce sera plus clair !
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  10. #10
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 156
    Points : 62
    Points
    62
    Par défaut
    pardon j'ai pas fait attention
    merci

  11. #11
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Ca dépend du SGBD qui est derrière. Avec SQL Server et ADO, tu peux parfaitement mettre plusieurs statements dans une même requête.
    Dans un TADOQuery ou un TADOCommand?
    sans mettre un begin end ?
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  12. #12
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Dans un TADOQuery ou un TADOCommand?
    La plupart du temps, je fais directement un Execute à partir de la connexion (et de la vrai connexion ADO, pas de l'encapsulation dbGO).

    Mais en fait, je ne me suis jamais posé de questions. Je l'ai toujours fait et ça n'a jamais posé de problèmes. Je le fais surtout pour grouper une série d'insert dans un seul batch.

    sans mettre un begin end ?
    Le begin end c'est pour grouper des instructions Oracle non ?
    Je ne le fait pas pour SQL Server.

  13. #13
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    La plupart du temps, je fais directement un Execute à partir de la connexion (et de la vrai connexion ADO, pas de l'encapsulation dbGO).
    Ok

    Citation Envoyé par Franck SORIANO Voir le message
    Le begin end c'est pour grouper des instructions Oracle non ?
    Oui on utilises cela avec Oracle.
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

Discussions similaires

  1. la commande SQL ne se termine pas correctement
    Par FullOver dans le forum Struts 1
    Réponses: 15
    Dernier message: 21/05/2008, 19h26
  2. la commande sql ne se termine pas correctement
    Par watiero dans le forum SQL
    Réponses: 5
    Dernier message: 01/10/2007, 10h19
  3. la commande sql ne se termine pas correctement
    Par watiero dans le forum Sql*Plus
    Réponses: 11
    Dernier message: 28/09/2007, 22h17
  4. Réponses: 5
    Dernier message: 21/08/2007, 13h47
  5. ORA-00933 la commande SQL ne se termine pas correctement
    Par habasque dans le forum Sql*Plus
    Réponses: 1
    Dernier message: 09/12/2006, 14h41

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