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 :

Base SQLite, ajout d'enregistrements [Lazarus]


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 Base SQLite, ajout d'enregistrements
    Bonjour,

    Je tente par code d'ajouter un enregistrement à une table nommée Infosvue d'une base SQLITE3 (Base1.db3) dans un programme Lazarus ( version 1.4.2. sous W7). Les données que je souhaite ajouter sont dans un tableau unidimensionnel (valtab [1], valtab[2] valtab [3]). Les colonnes de la table qui a pour nom InfosVUe ont pour en-tête de champ les noms Archiv, Nom1, Prenom1
    nota : une autre partie du programme qui elle, fonctionne bien, me permet d'actualiser les valeurs associées aux variables du tableau et qui sont toutes des Strings.
    Pour cela je construit la variable RequetAjout suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RqtAjoutAB :=  'Insert Into  Infosvue ( Archiv,  Nom1, Prenom1 ) Values ( quotedStr(Valtab[1]), quotedStr(Valtab[2]), quotedStr(valtab[3]) )' ;
    et je modifie la valeur du SQL d'un ZQQuery par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ZC_Cree1.Connected := False ;
             ZC_Cree1.Database := DnomBaseA ;
             ZC_Cree1.Connected := True ;
             ZQ_Cree1.SQL.Clear ; // Mise à zéro de la chaine SQL
             ZQ_Cree1.SQL.Text :=  RqtAjoutAB ;
             ZQ_Cree1.ExecSQL ;
    où ZC_Cree1 et ZQ_Cree1 sont les composants Zeos associés à la base de nom complet DnomBaseA.

    Ce code me renvoie une erreur SQL à l’exécution et pourtant toutes les variables existent bien.
    Cela fait plusieurs heures que je tente de résoudre le problème sans succès.
    D'autre part, est-il utile, prudent, nécessaire (?) de fermer l'accès à la table par un une fois l'ajout effectué

  2. #2
    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 Suite de mon message a/s Base SQlite
    J'avais oublié la fin de mon message pour cette nouvelle discussion.

    Merci d'avance pour vos réponses éclairées, en cette période de vacances.

    Cordialement

    R.O.

  3. #3
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour,

    Sauf erreur quotedStr est une fonction de Lazarus, pas de Sql(Lite)
    Il faut donc écrire plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RqtAjoutAB :=  'Insert Into  Infosvue ( Archiv,  Nom1, Prenom1 ) Values ( '+ quotedStr(Valtab[1])+ ',' + quotedStr(Valtab[2])+ ',' + quotedStr(valtab[3])+ ' )' ;
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  4. #4
    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 Base SQLITE - ajout d'enregistrement
    Bonjour à tous,
    Merci à Tintinux pour sa réponse
    En fait la solution se trouvait dans une discussion un peu plus bas dans la discussion initiée par ALT pour MySQL. et l'erreur venait de la rédaction de la requête comme le note Tintinux et un code correct est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RqtAjoutAB :=  'Insert Into  Infosvue ( Archiv,  Nom1, Prenom1 ) Values ( '+ quotedStr(Valtab[1]) +',' + quotedStr(Valtab[2]) +',' +quotedStr(valtab[3])+' )' ;
    Par contre je suis toujours preneur de la façon de terminer proprement la gestion des tables pour éviter une corruption éventuelle lorsque les opérations pour lesquelles on les sollicite sont terminées :
    ZQQuery. Close ?? ou toute autre instruction adéquate.

    Merci

    Cordialement

    R.P.

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    pour ma part j'utilise la fonction format pour construire mes requette


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RqtAjoutAB := Format('Insert Into  Infosvue ( Archiv,  Nom1, Prenom1 ) Values ( %s, %s ,%s ) ',
     [ quotedStr(Valtab[1])
     , quotedStr(Valtab[2])
     , quotedStr(valtab[3]) ]
    ) ;
    je trouve cela plus clair
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Citation Envoyé par OR34a Voir le message
    D'autre part, est-il utile, prudent, nécessaire (?) de fermer l'accès à la table par un une fois l'ajout effectué
    Je ne pense pas que fermer la requête ait un quelconque effet.
    On peut essayer de fermer complètement la connexion, donc la "base", en espérant que le fichier soit complètement écrit sur disque.

    Personnellement j'ai rencontré fréquemment des pertes de données ou d'intégrité avec SQL Lite, sur des applications variées, dont certaines assez largement diffusées.
    Elles sont généralement provoquées par des arrêts brutaux de la machine, même ne survenant pas pendant des écritures en base.
    La raison est que Sql Lite n'est pas un SGBD serveur, et qu'il ne peut pas gérer l'intégrité aussi bien qu'un vrai serveur où ça n'arrive jamais.

    L'installation de MariaDb (ou MySql) sur un poste n'est pas du tout compliquée ni consommatrice et évite tous ces soucis, pour moi c'est la bonne solution.

    PS : il faut mieux éviter de poser 2 questions sans rapport dans le même fil.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  7. #7
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut

    Plusieurs choses:
    - je préfère l'emploi de paramètres plutôt que de valeurs passées directement dans le code de la requête, je pense que c'est plus sûr.
    - le Close ne sert pas à grand chose dans une requête de mise à jour puisqu'aucun ensemble de données n'a été retourné (comme avec SELECT)
    - enfin un petit COMMIT après la mise à jour de tes données serait certainement le bienvenu (en employant les méthodes StartTransaction et Commit de TZConnection et Rollback en cas d'erreur).

    Ce qui pourrait donner 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
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
      ZC_Cree1.Connected := False ;
      ZC_Cree1.Database := DnomBaseA ;
      ZC_Cree1.Connected := True ;
      //ZQ_Cree1.SQL.Clear ; // inutile, l'instruction ci-dessous remplace le précédent texte
      ZQ_Cree1.SQL.Text :=  'Insert Into  Infosvue ( Archiv,  Nom1, Prenom1 ) Values ( :Archiv,  :Nom1, :Prenom1 ) ';
      ZQ_Cree1.Connection.StartTransaction;
      try
        ParamByName('Archiv').AsString := Valtab[1];
        ParamByName('Nom1').AsString := Valtab[2];
        ParamByName('Prenom1').AsString := Valtab[3];
        ZQ_Cree1.ExecSQL;
        ZQ_Cree1.Connection.Commit;
      except
        on e: Exception do
        begin
          e.Message  := e.Message + 'Insertion annulée.';
          ZQ_Cree1.Connection.Rollback;
          raise e;
        end;
      end;
    Il est vrai que le code est alors un peu plus long...

    A vérifier, ça fait un petit bout de temps que je n'ai pas codé en base de données.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #8
    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 a/s Base SQLITE
    Bonjour à tous et merci pour vos réponses très utiles.
    C'est vrai, j'avais posé deux questions dans la même dicussion et vous prie de m'en excuser.
    Je considère le problème résolu et le signale comme tel.
    Cordialement

    R.O.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  2. Réponses: 7
    Dernier message: 20/08/2009, 18h00
  3. Base 4D Ajouter enregistrement ne fonctionne plus
    Par Pharaon54 dans le forum 4D
    Réponses: 0
    Dernier message: 13/08/2009, 10h48
  4. Ajouter un enregistrement dans une base de donnée mysql sur click bouton
    Par gueguenk dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/06/2009, 15h44
  5. Réponses: 3
    Dernier message: 26/10/2008, 11h10

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