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 :

Créer une base Sqlite3 dans une application [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 389
    Par défaut Créer une base Sqlite3 dans une application
    Bonjour,

    J'utilise les composants natifs Sqlite3 sous Lazarus, mais habituellement je crée ma base et ses tables et champs avec Squilte browser ; mais voilà, je voudrais au lancement de mon application initialiser différents paramètres qui seront utilisés ensuite.
    Exemple : j'ai une base Sqlite principale qui se trouve dans un répertoire particulier /tables mais au premier démarrage de l'application ce répertoire n'est pas connu et naturellement les propriétés filename ne sont pas renseignées ou sont erronées.
    Donc je souhaite créer une table INIT.sdb au premier lancement pour y inscrire cette valeur filename et d'autres informations.
    Par le passé, il y avait un site ayant ces informations mais depuis il a disparu et je ne retrouve pas ces infos et en particulier le type de variable à déclarer pour cette table INIT.sdb ainsi que le test de présence de cette table après l'initialisation.

    J'ai bien trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if not TableExists then
        begin
          FieldDefs.Clear;
          FieldDefs.Add('Id', ftAutoInc);
          FieldDefs.Add('Prénom', ftString);
          FieldDefs.Add('Nom', ftString);
          CreateTable;
        end;
        Open;;
    Mais je n'arrive pas au résultat escompté.
    Alors un petit coup de main me ferait du bien.
    Merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 161
    Par défaut
    hello ovni76,
    moi j'utilise les composants TSQLite3Connection, TSQLQuery, , TSQLTransaction (SQLdb) pour gérer les bases sqlite3. J'utilise le SQL pour créer les tables comme ceci par exemple :
    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
    22
    23
    24
    25
    var LesTables: TStringList;
    begin
      LesTables := TStringList.Create();
      ForceDirectories(ExtractFilePath(application.ExeName));
      uDM.Sqlite3Tournois.DatabaseName :=
        ExtractFilePath(application.ExeName) + 'epreuves\' + NomTournoi.Text + '.db3';
      uDM.SQLite3Tournois.Open;
      uDM.SQLTransTournois.StartTransaction;
      uDM.SQLite3Tournois.GetTableNames(LesTables);
     
      if LesTables.IndexOf('tournoi') = -1 then
      begin
        uDM.SQLite3Tournois.ExecuteDirect('CREATE TABLE tournoi' +
          ' (Id  INTEGER PRIMARY KEY , Epc BOOL_INT ,' +
          'Epreuve VARCHAR(255) , Nom VARCHAR(255) , ' +
          'Description VARCHAR(255) , Lieu VARCHAR(255) ,' +
          'Date VARCHAR(255) , NbParties INTEGER , ' +
          'TypePartie BOOL_INT , PartieOriginale BOOL_INT , ' +
          'Lock BOOL_INT , Fini BOOL_INT, PeC INTEGER, ' +
          'Tarif1 INTEGER, Tarif2 INTEGER , Tarif3 INTEGER,Tarif1 INTEGER, ' +
          'TopP1 INTEGER,TopP2 INTEGER,TopP3 INTEGER, ' +
          'TopP4 INTEGER,TopP5 INTEGER,TopP6 INTEGER, ' + 'TopP7 INTEGER)');
      end;             
      uDM.SQLTransTournois.Commit;
      LesTables.Free;
    avec uDM.SQLite3Tournois : TSQLite3Connection
    uDM.SQLTransTournois : TSQLTransaction

    amicalement, nullosse

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    On peut aussi faire systématiquement un 'CREATE TABLE IF NOT EXISTS tournoi' + ...
    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 !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 389
    Par défaut
    Bonjour,
    Merci pour vos réponses, mais je n'arrive pas au résultat souhaité.
    Déjà les instructions avec en tête uDM. ne sont pas reconnues par mon installation, j'utilise les composants natifs et naturellement je ne peux suivre le raisonnement proposé.
    En cherchant j'ai trouvé qu'un clic droit sur le composant Sqlite3Dtaset ouvre une fenêtre avec le choix create/edit, donc le composant peut créer une table ou base ?
    Mais c'est la peut-être mon problème, connaissant mieux le système Dbase que Sqlite, le premiers à des tables le second à une ou des bases comprenant des tables...
    J'ai trouvé avec ce composant une commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sqlite3Dataset1.CreateTable('/home/j/Bureau/laz-linux/test/sources/INIT.sdb');
    avec laquelle j'ai tenté de créer une base INIT.sdb mais la commande semble liée à la création de table, donc si je raisonne correctement il faudrait déjà créer la base puis les tables avec leurs composants, mais comment faire ?
    A+

  5. #5
    Membre expérimenté
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 161
    Par défaut
    hello ovni76,

    oops désolé j'ai un peu compliqué mon exemple car udm est un Tdatamodule. Fais comme si il n'existait pas. Si les composants SQLDB sont sur la fiche où tu fais les traitements tu mets directement Sqlite3Tournois.DatabaseName par exemple.


    voici ce qui est écrit concernant le Tsqlite3DataSet dans le wiki database de lazarus :
    Créer une Table (jeux de donnée)
    Double cliquez sur l’icône du composant ou employer l'item 'Create Table' du menu automatique qui apparaît en cliquant le bouton de souris droit . Un simple éditeur de table parlant de lui-même sera montré.
    Je ne sais pas si on peut créer directement le fichier de base de données avec le composant tsqlite3dataset.


    Amicalement, nullosse

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 389
    Par défaut
    Merci pour ta réponse, j'ai vu le messagedu wiki mais cela est valable à la conception de l'appli, mon besoin est que j'ai des petites applications de gestion de données sous sqlite que je veux pouvoir donner par exemple à mes petits enfants, ces applications que j'utilise sous linux sont développées aussi sous linux et je les adapte pour les utilisateurs potentiels sous windows. Jusque la pas de problème sauf que j'utilise un datamodule avec une base sqlite contenant plusieurs tables qui ont un Filename qui est lié à l'installation de l'appli que j'organise ainsi répertoire d'installation avec le nom de l'appli qui a plusieurs sous répertoire s au même niveau /sources, /tables, et des tables de sauvegarde, de plus je vais importer des informations dans un répertoire de téléchargement.
    Ces informations sont donc variables dans leur forme entre linux et windows et dans leur lieu
    (disque répertoire). C'est ces informations que je veux pouvoir initialiser à la première utilisation de l'appli après installation.
    Mon idée est de créer une base avec une table ayant les champs suivant : chemin du répertoire tables pour initialiser le filenanme de mes tables principales, chemin pour l(importation des données, champ indiquant que l'initialisation a été effectuée ou pas, donc c'est cette table que je veux pouvoir créer au 1er lancement de l'appli car elle aussi a besoin d'un filename, valeur que je peux connaître facilement au démarrage de l'appli.
    Le problème, pour moi vient du fait qu'une base de données sqlite à une base qui peut avoir un nom du genre INIT.sdb et contenir une ou plusieurs tables du genre initialisation.
    Je n'ai pas trouvé de commande permettant en cours de fonctionnement de l'appli de créer une base et une table associée à cette base.
    Je devrais peut-être me tourner vers une table dbase qui de mémoire se crée plus facilement.
    Mais je persiste à penser que ce qui peut se réaliser en conception avec sqlite3dataset devrait pourvoir se réaliser à l'éxecution et de plus ce serait dommage d'utiliser 2 types de tables mais pas impossible.
    merci et A+

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 917
    Billets dans le blog
    6
    Par défaut
    En simplifiant le code de Nullosse, je suis parvenu à écrire le code suivant, qui crée bien une base et la table voulue et la peuple (je la lis autrement, car jusqu'à il y quelques minutes, je ne connaissais pas ces composants !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      SQLite3Connection1.DatabaseName:='c:\userfiles\test3.bdd'; // fichier inexistant
      SQLite3Connection1.Transaction := SQLTransaction1; // si pas défini en conception
      SQLite3Connection1.Open; // ou SQLite3Connection1.Connected:=True; // crée la base
     
      SQLTransaction1.DataBase := SQLite3Connection1; // si pas défini en conception
      SQLTransaction1.StartTransaction;
      SQLite3Connection1.ExecuteDirect('CREATE TABLE employes ( id INTEGER PRIMARY KEY , nom TEXT , age INTEGER )');
      SQLTransaction1.Commit; // crée la table
     
      SQLTransaction1.StartTransaction;
      SQLite3Connection1.ExecuteDirect('INSERT INTO employes ( nom , age ) VALUES ( ''toto'' , 50 )');
      SQLTransaction1.Commit; // ajoute un enregistrement
     
      SQLite3Connection1.Connected:=False;
    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 !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 389
    Par défaut
    Merci toulourou, ça marche.
    Donc problème résolu.
    A+

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

Discussions similaires

  1. [AC-2003] Import depuis une base A dans une Base B
    Par ted the Ors dans le forum VBA Access
    Réponses: 1
    Dernier message: 26/01/2010, 19h59
  2. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  3. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  4. [MySQL] Supprimer une ligne afficher dans une base de donnée
    Par julienchpt dans le forum PHP & Base de données
    Réponses: 31
    Dernier message: 14/10/2005, 15h45
  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, 21h24

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