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

Delphi Discussion :

Enregistrer des données dans une table sql, via une application delphi, avec clé auto-incrément


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Enregistrer des données dans une table sql, via une application delphi, avec clé auto-incrément
    Slt les amis. Je travaille sur un petit projet personnel où j'ai lié mon application delphi à sql server 2008. Cependan, j'ai du mal à enregistrer des données dans sql quand la clé primaire de ma table "Frais" est de type auto-incrément. J'utilise ADOCommande et ADOConnection. Quelqu'un pourrait m'aider?

    Voici un extrait de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    adoc1.CommandText := 'INSERT INTO frais VALUES(:idF, :libF, :tarF, echF)';
    adoc1.Parameters.ParamValues['idF'] := edtCodeF.Text;//identifiant
    adoc1.Parameters.ParamValues['libF'] := edtLibF.Text; //Libellé frais
    adoc1.Parameters.ParamValues['tarF'] := strtoint(edtTarF.Text);//Tarif ou montant à payer
    adoc1.Parameters.ParamValues['echF'] := dtpEchF.Text;//Echéance
    adoc1.Execute;
     
    showmessage('Succès!');

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 932
    Points
    40 932
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    si la colonne IDF est la colonne auto-incrémentée alors il ne faut pas la mettre dans le INSERT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    adoc1.CommandText := 'INSERT INTO frais VALUES( :libF, :tarF, echF)';
    adoc1.Parameters.ParamValues['libF'] := edtLibF.Text; //Libellé frais
    adoc1.Parameters.ParamValues['tarF'] := strtoint(edtTarF.Text);//Tarif ou montant à payer
    adoc1.Parameters.ParamValues['echF'] := dtpEchF.Text;//Echéance
    adoc1.Execute;
    Si non, car vous n'êtes pas très explicite quant à l'erreur, je trouve étonnant que :
    - l'échéance soit une string et non une date ( le format d'une colonne de type date est souvent spécifique à une SGBD, pour SQL Server YYYY-MM-DD) donc il y a là source d'erreur potentielle
    - Il est étonnant que la colonne TarF puissent être un Tarif ou un Montant (selon votre commentaire), un Tarif je comprend que cela puisse être un code de type entier, peut être en référence à une table Tarif ? auquel cas il faut être sur que ce code existe bien dans la table, mais un montant .. Généralement une colonne montant est de type NUMERIC ou DECIMAL avec 2 chiffres après la virgule sans parler du fait que StrtoInt est également une source d'erreur potentielle

    Donc si vous nous indiquiez quelle erreur est levée par votre code ?
    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

  3. #3
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 419
    Points : 1 096
    Points
    1 096
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    ,

    si la colonne IDF est la colonne auto-incrémentée alors il ne faut pas la mettre dans le INSERT
    Mais dans ce cas, il faut lister les colonnes à insérer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adoc1.CommandText := 'INSERT INTO frais (LibF, tarF, EchF) VALUES( :libF, :tarF, :echF)'
    NB1 : je suppose que les colonnes ont le nom correspondant à la variable utilisée
    NB2 : pour autant que j'ai bien vu, il manque un : au paramètre echF

    Cordialement

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 932
    Points
    40 932
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par acaumes Voir le message
    NB2 : pour autant que j'ai bien vu, il manque un : au paramètre echF
    Bien vu
    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

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    @baronmbk : Ce n'est pas le bouton « Créer une entrée Blog  » qu'il faut utiliser, c'est sous le dernier message. Je recopie ici ce que tu as écrit :
    Citation Envoyé par baronmbk
    Merci beaucoup pour votre aide. J'ai revu mon code en enlevant le champ de l'identifiant dans la requête sql et en ajoutant quelques petites corrections.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    adoc1.CommandText := 'INSERT INTO frais(LibelléF, TarifF, EcheanceF) VALUES(:libF, :tarF, echF)';
    adoc1.Parameters.ParamValues['libF'] := edtLibF.Text; //Libellé frais
    adoc1.Parameters.ParamValues['tarF'] := strtofloat(edtTarF.Text);//Tarif ou montant à payer
    adoc1.Parameters.ParamValues['echF'] := dtpEchF.Date;//Echéance
    adoc1.Execute;
     
    showmessage('Succès!');
    Maintenant je reçois l'erreur suivante: "Echec de la conversion de la date et/ou de l'heure à partir d'une chaîne de caractère"

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci Winjerome pour la régularisation de mon message.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 932
    Points
    40 932
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    finalement j'avais bien anticipé en vous indiquant que
    - l'échéance soit une string et non une date ( le format d'une colonne de type date est souvent spécifique à une SGBD, pour SQL Server YYYY-MM-DD) donc il y a là source d'erreur potentielle
    Et, une fois celle-ci éliminée, au vu de vos corrections, il est fort possible qu'une nouvelle erreur prendra le relais à cause de cette ligne-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adoc1.Parameters.ParamValues['tarF'] := strtofloat(edtTarF.Text);
    Voilà pourquoi je type toujours le passage de mes valeurs, l'autre solution étant bien sûr de vérifier que les paramètres soit correctement déclarés dans le DFM bien sûr (ce qui pourrait bien être votre source d'erreur, vérifiez les types des paramètres de votre ADOQuery)
    Cependant, comme vous semblez utiliser adoc1 comme requête "fourre-tout" il serait peut être plus judicieux d'utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adoc1.Parameters.Params.Clear;
    juste avant l'écriture de Adoc1.Command.text.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    adoc1.Parameters.Params.ParamByName['libF'].asString := edtLibF.Text; //Libellé frais
    adoc1.Parameters.Params.ParamByName['tarF'].asFloat := strtofloat(edtTarF.Text);//Tarif ou montant à payer
    adoc1.Parameters.Params.ParamByName['echF'].asDateTime := dtpEchF.Date;//Echéance
    P.S. N'étant pas un fan de ADO, et donc ne l'utilisant presque jamais , il se peut que mes syntaxes soient bancales
    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

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    En fait, j'utilise ADOCommand que j'ai renommé adoc1 comme dans un tuto que j'ai trouvé sur youtube :

    Est-ce que la syntaxe ne serait pas un peu différente de ce que tu me proposes?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Toutefoise, j'essaie aussi avec ADOQuery

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Tout en conservant ADOCommand, je constate que si je n'enregistre pas la date, il n'y a plus d'erreur. Donc mon gros problème demeure l'enregistrement de la date via le datetimepicker:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    adoc1.CommandText := 'INSERT INTO frais(LibelléF, TarifF, EcheanceF) VALUES(:libF, :tarF, echF)';
    adoc1.Parameters.ParamValues['libF'] := edtLibF.Text; //Libellé frais
    adoc1.Parameters.ParamValues['tarF'] := strtofloat(edtTarF.Text);//Tarif ou montant à payer
    
    {adoc1.Parameters.ParamValues['echF'] := dtpEchF.Date;//Echéance}
    
    adoc1.Execute;
     
    showmessage('Succès!');

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 932
    Points
    40 932
    Billets dans le blog
    62
    Par défaut
    Preuve que ADO et moi cela fait 2 je ne connaissais même pas ADOCommand
    Oui,la syntaxe est différente quoique il serait à vérifier s'il n'est pas possible, malgré tout, de typer les paramètres.
    Et, après avoir visionner une partie de la vidéo, j'ai vu que les paramètres étaient typés dans le dfm (6 mn 20 de la vidéo)
    il faudrait vérifier si vos types (en particulier la date) sont corrects
    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

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Preuve que ADO et moi cela fait 2 je ne connaissais même pas ADOCommand
    Oui,la syntaxe est différente quoique il serait à vérifier s'il n'est pas possible, malgré tout, de typer les paramètres.
    Et, après avoir visionner une partie de la vidéo, j'ai vu que les paramètres étaient typés dans le dfm (6 mn 20 de la vidéo)
    il faudrait vérifier si vos types (en particulier la date) sont corrects

    J'ai compris le jeu. En fait les paramètres de ADOCommand ont une propriété datatype qui est censée prendre la valeur date mais pour quelque raison, ne l'accepte pas. J'ai finalement opté pour le type datetime dont j'ai fait correspondre l'équivalent dans sql server.

    Voici ce que ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    adoc1.CommandText := 'INSERT INTO frais(LibelléF, TarifF, EcheanceF) VALUES(:libF, :tarF, echF)';
    adoc1.Parameters.ParamValues['libF'] := edtLibF.Text; //Libellé frais
    adoc1.Parameters.ParamValues['tarF'] := strtofloat(edtTarF.Text);//Tarif ou montant à payer
    adoc1.Parameters.ParamValues['echF'] := dtpEchF.DateTime;//Echéance
     
    adoc1.Execute;
     
    showmessage('Succès!');
    Merci bcp pour votre aide.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/06/2015, 16h13
  2. Réponses: 3
    Dernier message: 23/01/2012, 15h55
  3. [phpMyAdmin] Insérer des données dans mes tables SQL (phpMyAdmin) ?
    Par bond70 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 19/10/2009, 00h16
  4. utiliser formulaire pour enregistrer des données dans différentes tables
    Par silue fignigue siaka dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 11/04/2009, 14h53
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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