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 :

Composants natifs de Sqlite


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut Composants natifs de Sqlite
    Bonjour,
    Toujours dans mon exploration de lazarus et sqlite, j'ai voulu faire des essais avec le composant natif de lazarus, surtout que je le pensais plus au point puisqu'en version 1.xx. La principale différence au départ c'est qu'il faut utiliser plusieurs composants : TSQlite3Connection, TSQLTransaction et TSQLQuery avec un TDatasource.
    Pour l'usage du composant sqlite3 (se trouvant dans le répertoire composants) il ne faut que en plus du Tdatasouce que le composant TSqlite3Datset.
    Jusque là point de problème. Mais à l'usage mes modestes connaissances sont mis à mal car je n'arrive pas effacer un enregistrement, je n'arrive pas à compacter ma base, pourtant avec l'autre composant pas de problèmes.
    Je joins ci-dessous les 2 parties de programme qui fonctionnent avec TSQLite3Dataset et pas avec le natif espérant que l'un d'entre vous pourra m'indiquer mes erreurs.

    pour effacement avec TSqlite3Dataset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NBENREG:=SAutomat.RecNo;
      Edit3.Text:=IntToStr(NBENREG);
      MQ:='Delete from AUTOMAT WHERE K_AUTOMAT='+IntToStr(NBENREG);
      SAutomat.SQL:=MQ;
      SAutomat.ExecSQL;
      SAutomat.ApplyUpdates;
      SAutomat.Close;
      SAutomat.SQL:='Select * from AUTOMAT order by CODEDATE';
      SAutomat.Open;
      SAutomat.ExecSQL;
      SAutomat.RefetchData;
    Le même avec les composants natifs
    SQLBank est un composant TSQLQuery qui remplace semble-t-il le passage de la commande SQL dans l'autre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    XKEY:=SQLBank.FieldByName('K_BANK').Value;
      SQLBank.Close;
      MQ:='Delete from BANK WHERE  K_BANK='+IntToStr(XKEY);
      SQLBank.Open;
      SQLBank.SQL.Text:=MQ;
      SQLBank.ExecSQL;
      SQLBank.ApplyUpdates;
    Autre particularité, la recherche du nombre d'enregistrement avec la commande

    donne aussi des résultats très étranges

    avec le premier composant c'est la valeur des enregistrements dans la vue selon les demandes à la sélection de la table, mais avec le natif, c'est n'importe quoi puis la valeur devient correcte après par exemple l'essai de suppression d'un enregistrement.
    Toukours pour l'effacement j'ai tenté de le faire via le bouton d'un DBnavigator avec après la validation de la petite fenêtre de confirmation de l'effacement et un commande

    l'enregistrement est bien supprimé de la vue mais pas de la table, à la réouverture il est toujours présent "comme le canard de Robert Lamoureux"

    Tout cela fait beaucoup de questions, mais je n'y pas encore trouvé de réponses, alors merci de bien vouloir m'aider si possible.

  2. #2
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    XKEY:=SQLBank.FieldByName('K_BANK').Value;
      SQLBank.Close;
      MQ:='Delete from BANK WHERE  K_BANK='+IntToStr(XKEY);
      SQLBank.Open;
      SQLBank.SQL.Text:=MQ;
      SQLBank.ExecSQL;
      SQLBank.ApplyUpdates;
    La bonne syntaxe avec le TsqlQuery est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQLBank.Close;
    SQLBank.SQL.clear;
    SQLBank.SQL.Add('Delete from BANK WHERE  K_BANK='+IntToStr(XKEY));
    SQLBank.ExecSQL;
    SQLBank.ApplyUpdates;
    Chez moi ca marche Vérifie ta clé primaire et ton index car ça peut jouer

    @+

  3. #3
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Salut Chris37,
    J'ai fait la manipulation proposée mais chez moi je n'obtiens pas le résultat, je précise que je suis sous linux. Comme il y a une commande close j'ai supposée qu'il devait y avoir une commande open, mais slon l'endroit ou je la place j'ai ou un message d'erreur ou je plante ma base avec un message comme quoi elle est verrouillée.
    Le 2 premiers messages sont :
    - Opération Cannot be performed on an active dataset selon ma traduction opération pas possible sur une base non active
    - l'autre cannot open a non-select statement toujours selon ma traduction impossible d'ouvrir un élément non selectionné.
    Quand à la qualité de mon index, la même base (je la copie depuis un autre répertoire pour la protéger) fonctionne bien avec le composent sqlite3dataset.
    Alors où est l'erreur.
    Ci-dessous mon code avec les différentes position de ma commande open (sans j'ai un message d'erreur aussi)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    XKEY:=SQLBank.FieldByName('K_BANK').Value;
      SQLBank.Close;
      SQLBank.SQL.clear;
      //SQLBank.Open;
      SQLBank.SQL.Add('Delete from BANK WHERE K_BANK='+IntToStr(XKEY));
      SQLBank.Open;
      SQLBank.ExecSQL;
      //SQLBank.Open;
      SQLBank.ApplyUpdates;
    Merci d'avance

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    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 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    A mon humble avis les :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      SQLBank.Close;
      SQLBank.Open;
    Sont en trop . En principe , (test avec firebird pour le moins) , il ne faut faire d'Open et Close d'un SQL que si celui-ci renvoi un ensemble de données
    soit par exemple SELECT * FROM UNETABLE
    pour un DELETE ou un UPDATE ou autre Instructions ne renvoyant pas de données un Simple ExecSQL suffi .

    Maintenant , j'ai un doute avec les nouvelles possibilités de Firebird qui lors d'un UPDATE peut renvoyer des informations , mais là je m'écarte du sujet .
    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
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Bonjour SergioMaster,
    Et non cela ne fonctionne pas, ce qui est étrange c'est qu'une manipulation similaire fonctionne bien avec le composant Sqlite3Dataset ci dessous ma partie de programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    XKBANK:=SQLBank.FieldByName('K_BANK').Value;
      SQLBank.SQL:='Delete from BANK WHERE K_BANK='+IntToStr(XKBANK);
      SQLBank.ExecSQL;
      SQLBank.ApplyUpdates;
      SQLBank.Close;
      SQLBank.SQL:='Select * from BANK order by CODEDATE';
      SQLBank.Open;
      SQLBank.ExecSQL;
    je viens de refaire l'essai.
    Etrange !

Discussions similaires

  1. [Lazarus] Utilisation du composant natif Sqlite3Dataset
    Par ovni76 dans le forum Lazarus
    Réponses: 3
    Dernier message: 26/10/2014, 18h48
  2. Maintien à jour du composant System.Data.SQlite
    Par noftal dans le forum VB.NET
    Réponses: 0
    Dernier message: 14/01/2014, 16h57
  3. Modifier le source d'un composant natif de delphi
    Par The Jos dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/02/2009, 14h38
  4. quel est le meilleur composant pour gratuit "SQLite"
    Par helmis dans le forum Bases de données
    Réponses: 1
    Dernier message: 17/11/2008, 14h50
  5. Réponses: 1
    Dernier message: 20/08/2006, 18h48

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