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

Lazarus Pascal Discussion :

SQlite : créer des enregistrements


Sujet :

Lazarus Pascal

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut SQlite : créer des enregistrements
    Bonjour,

    Je me heurte à un problème majeur concernant la création de nouveaux enregistrement dans une base de données SQLITE-3.
    Je programme la création d'un variable "InsTbl1" qui servira a renseigner la valeur d'un ZQ_Tbl1.SQL.Text := InsTbl1 pour exécuter l'action de création de l'enregistrement. La table en question (Tbl1) contient plusieurs champs dont le premier est une clef primaire auto incrémentée (champ1) et les autres de variables Varchar renseignées par l'intermédiaire de contrôles Tedit dont la valeur est récupérée dans des TDBEdit ( je trouve que la présentation du formulaire est plus "didactique" qu'un Stringrid).
    J'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    structTbl1 := '(Champ2, Champ3, champ4, champ5, champ6)'
    DataTbl1 := '("' + VChamp2 + ' "," '+ VChamp3 + ..... + VChamp6 + ' ")' ;
    où Vchamp2 etc.. sont les valeurs prises par les champs Tedit concernés et dont la finalité est d'être stocké dans les champs de la table Tbl1 par l'intermédiaire des TDbedit

    et enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InsTbl1 := 'Insert Into Tbl1' + StructTbl1  + ' Values ' + DataTbl1 ;
    Le problème est qu'à l'exécution du Zquery.SQL.Text := Instbl1 j'ai un message d'erreur sur la base de données qui ne connait pas le dernier champ de la table (Champ6) et pourtant il existe bel et bien. ESt-ce du au fait que le champ1 est la clef primaire et qu'elle ne fait bien sur pas partie de la liste de champs à renseigner depuis le formulaire ?
    Des suggestions SVP.

    Merci

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 143
    Points : 41 314
    Points
    41 314
    Billets dans le blog
    63
    Par défaut
    Bonjour ,

    Je ne suis pas un accro de SQLLite mais plusieurs pistes sont à regarder .

    Tout d'abord votre clé primaire : est-un champ autoincrément (dans ce cas effectivement pas besoin de le renseigner) sinon il faut bien sur impérativement l'indiquer !


    ensuite de manière plus générale , préférez utiliser une requête paramétrée à une requête construite telle que indiquée (je sais , c'est un peu plus long à écrire mais pour des champs autres que des strings c'est beaucoup de galères en moins , je pense en particulier aux dates et aux floats)

    donc pour la même chose j'aurais écris (avec des ZEOS) , pour les besoins de l'exemple j'ai changer de type de champs pour chacune des valeurs
    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
     
    var ZROQ : TZReadOnlyQuery;
    begin
     structTbl1 := '(Champ2, Champ3, champ4, champ5, champ6)';
     ZROQ:=TZreadOnlyQuery.Create(nil);
     try
       ZROQ.Connection:=ZConnection1;
       ZROQ.SQL.Text:='INSERT INTO TBL1('+StructTbl1+') VALUES(:C2,:C3,:C4,:C5,:C6)';
       ZROQ.paramByName('C2').asString:=VChamp2.Text; 
       ZROQ.paramByName('C3').asInteger:=StrtoInt(VChamp3.Text); 
       ZROQ.paramByName('C4').asCurrency:=StrToFloat(VChamp4.Text); 
       ZROQ.paramByName('C5').asFloat:=StrToFloat(VChamp5.Text); 
       ZROQ.paramByName('C6').asDate:=StrToDate(VChamp6.Text); 
       ZROQ.ExecSQl;
     finally
       ZROQ.FreeAndNil;
     end;
    end;
    Ce qui peut poser problème dans votre code vient justement de l'utilisation des valeurs directement , imaginons un float 12,025 dans votre SQL cela donne 2 valeurs entières 12 et 025

    on peut bien sur créer directement le SQL mais dans ce cas , préférez les QuotedStr(Vchamp2) pour un String plutôt qu'avoir à se planter sur le nombre de ' et du coup également pourquoi utiliser un ZQuery et ne pas passer directement un Zconnection1.Executedirect(SQL);

    pour généré le SQL , il vous faudra aussi gérer le formatage des floats et des dates "à la main" en changeant par exemple le formatage par défaut par exemple :

    pour une date : Valeur:=QuotedStr(FormatDateTime('aaaa-mm-dd',date));

    pour un float un peu plus complexe encore il faudra
    1 - mémoriser le Decimalseparator en cours
    2 - le changer en '.'
    3- faire le formatage de la valeur
    4- restaurer le decimalseparator

    en reprenant l'exemple cela donnerait :
    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
     
    var odecsep : char;
    begin
     structTbl1 := '(Champ2, Champ3, champ4, champ5, champ6)';
    SQL:='INSERT INTO TBL1(%s) VALUES(%s,%d,%3.2f,%3.2f,%s)'
    odecSep:=decimalSeparator;
    decimalseparator:='.';
    SQL:=Format(SQL,[structTbl1,
                              QuotedStr(VChamp2.text),
                              StrToInt(VChamp3.text),
                              StrToFloat(VChamp4.Text), 
                              StrToFloat(VChamp5.Text), 
                              QuotedStr(FormatDateTime('aaaa-mm-dd',StrToDate(VChamp6.Text)))]);
    ZConnection.Executedirect(SQL);
    DecimalSeparator:=odecSep;
    Finalement , la requête paramétrée a du bon non ? Notez que j'utilise les deux dépendant du contexte

    Autre remarque , pour un Insert préférez un ZReadonlyQuery a un ZQuery

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Remerciements
    Bonjour,

    Merci beaucoup pour votre réponse argumentée et complète. Je vais tester cela.
    Effectivement mon index était auto-incrémenté.

    Cordialement

    R. O.

Discussions similaires

  1. [AC-2010] Créer des enregistrements vides dans des tables
    Par bluebird3 dans le forum Access
    Réponses: 5
    Dernier message: 14/03/2014, 07h36
  2. 4D web / créer des enregistrements
    Par scottie dans le forum 4D
    Réponses: 2
    Dernier message: 23/10/2013, 10h11
  3. [AC-2010] Créer des enregistrements par date à partir d'une période
    Par tangono dans le forum Access
    Réponses: 1
    Dernier message: 23/04/2013, 11h46
  4. Créer des enregistrements
    Par marie10 dans le forum Access
    Réponses: 2
    Dernier message: 27/01/2006, 15h58

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