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 :

Sqlite3Dataset : comment supprimer une table ? [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut Sqlite3Dataset : comment supprimer une table ?
    Bonjour,

    il est possible de créer une table avec la méthode CreateTable du composant, je supposais donc qu'il y avait un équivalent pour détruire une table ou au moins la vider (genre DeleteTable ou DropTable) mais je n'ai rien trouvé en fouillant dans le code source ...

    J'ai donc essayé avec du SQL (Delete, Drop, Truncate, ...) mais impossible : au mieux il ne se passe rien, au pire une exception !

    Mon but : retrouver la table vide comme lors de sa création.
    Si quelqu'un a la solution.

    Cordialement.
    Christian

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    As-tu essayé (SQLite 3.7) :
    1) DELETE FROM database.table // devrait supprimer tous les enregistrements
    2) DROP TABLE (IF EXISTS) table // devrait effacer une table construite avec CREATE TABLE
    L'aide de SQLite.org est en anglais mais peut fournir des pistes : le SQL de SQLite
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Mon souci est que je veux vider ma table à l'intérieur d'un programme Lazarus en utilisant le composant Sqlite3Dataset.

    Je viens de faire un programme de test pour essayer de comprendre le comportement : un composant Sqlite3Dataset (SaveonClose à True, FileName et TableName ('matable') renseignés), un Datasource et un dbgrid pour voir ce qui se passe ...

    J'exécute tout d’abord le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if not TableExists then
        begin
          FieldDefs.Clear;
          FieldDefs.Add('Id', ftAutoInc);
          FieldDefs.Add('Prénom', ftString);
          FieldDefs.Add('Nom', ftString);
          CreateTable;
        end;
        Open;
    Tout est OK, la base et la table sont créées.
    Les en-têtes de colonnes apparaissent dans le grid avec une ligne vide.

    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Open;
        Dataset.Append;
        Dataset.FieldByName('Prénom').AsString:= 'Gérard';
        Dataset.FieldByName('Nom').AsString:= 'Jugnot';
        Dataset.Post;
    l'enregistrement est ajouté (apparaît dans le grid)

    Enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Close;
        Sql:= 'delete from matable';
        Open;
    le ou les enregistrements disparaissent (a priori ce à quoi je m'attendais) mais le grid n'affiche plus les en-têtes ... pourtant delete est censé vider la table mais conserver sa structure ?!

    A ce moment, si je relance le code permettant l'ajout d'un enregistrement, j'ai l'exception suivante : Field not found "Prénom"

    Tout se passe comme si la table n'existait plus ! A noter que si je quitte le programme, je peux vérifier (dans un programme style SqliteSpy) que la table existe bien et est vide ...

    Si je relance le code de création de la table, il n'est pas exécuté, preuve que TableExists renvoie True ... donc la table existe mais les champs ont disparu !

    Je dois fermer le programme et le rouvrir pour voir réapparaître les en-têtes dans le grid et pouvoir à nouveau ajouter un enregistrement ...
    J'ai ajouté 'ApplyUpdates' après le code du 'delete' mais cela ne change rien.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Autre approche : au lieu de vider ma table, j'essaie de la détruire avec 'DROP' en exécutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ExecSql('Drop table if exists matable');
    suivi ou non de ApplyUpdates (cela ne change rien).

    la table est bien détruite (si je relance le code de création, il est bien exécuté). Mais les enregistrements sont toujours visibles dans le grid (j'ai essayé DBGrid1.Refresh ? mais cela n'a pas d'effet), je peux même en ajouter des nouveaux (id s'incrémente !). Même après voir recréé la table !

    J'ai donc une solution à mon problème :
    1) détruire la table avec 'DROP'
    2) faire Dataset.Close
    3) recréer la table (cette fois elle est vide)

    mais tout ceci est bien mystérieux ! ...

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Je ne pourrai t'aider sur l'utilisation de tous ces composants bien mystérieux et compliqués pour moi... Je n'utilise SQLite que directement.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Merci quand même pour ton aide.

    Cela veut dire quoi utiliser SQLite directement ? En ligne de commande ?

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Grâce à son API/interface en C pour laquelle il existe des wrappers.

    J'en ai écrit un (très dépouillé) qui s'interface avec Lazarus, et une encapsulation dans un objet, qui me permet d'exécuter des requêtes et de récupérer les résultats dans des TStrings ou TStringGrid : ceci suffit pour mes besoins basiques.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/12/2007, 14h06
  2. Comment supprimer plusieurs table d'une base ?
    Par b_lob dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/07/2007, 18h51
  3. comment supprimer une clé primaire d'une table ?
    Par polianita dans le forum Access
    Réponses: 10
    Dernier message: 03/08/2006, 15h34
  4. Comment Copier une table dans un fichier?
    Par thx2003 dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/12/2003, 12h09

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