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 :

Tester si une table existe dans une base Sqlite [Lazarus]


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 Tester si une table existe dans une base Sqlite
    Bonjour,
    Je sais tester si une base Sqlite3 existe dans une application Lazarus, mais pour savoir si une table existe dans la base je ne sais pas comment faire.
    Je suis sous Linux et Lazarus 1.2.4.
    Merci d'avance pour votre aide.
    A+

  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
    Bonjour,
    On doit pouvoir exploiter le retour du SQL suivant :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    PRAGMA table_info(table-name)
    Si c'est pour créer au besoin la table inexistante, on a la possibilité de faire un :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE IF NOT EXISTS
    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
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    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 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Salut,

    Rapido, en interrogeant la table système sqlite_master:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DISTINCT name FROM sqlite_master
    WHERE type='table'
    AND NAME =:NAME;
    devrait te dépatouiller, cela provient de la FAQ SQLite. Tu obtiens alors 1 ou 0 ligne selon la présence ou l'absence de la table passée en paramètre NAME.
    Rem: la présence de table(s) système(s) fait partie de la norme SQL, si je me souviens bien, elles reflètent la structure de la base de données. Leur structure n'est par contre pas normalisée, tout dépend du SGBDR.

    @+

    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."

  4. #4
    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 viens de faire le test : si la table n'existe pas, PRAGMA table_info(nom-de-la-table) retourne SQLITE_OK (donc pas d'erreur), mais aucune ligne (sinon, une ligne par colonne de la table, pour les décrire).
    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 !

  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
    Merci pour vos réponses
    Mais comment tester la réponse d'une commande SQL,
    en complément comment intercepter et exploiter un message d'erreur sous lazarus ?
    A+

  6. #6
    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
    Quand je parlais de code d'erreur, c'est celui que renvoie chaque fonction de l'API SQLite. Elles sont encapsulées et masquées dans les méthodes des composants d'accès aux BDD. Mais je ne m'en sers pas jusqu'ici... Il suffit probablement d'utiliser un DataSet et de compter les lignes après exécution de la commande ?
    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 !

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 33
    Points : 100
    Points
    100
    Par défaut
    Une petite fonction booléenne pour tester si une table existe (passer le nom en paramètre):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function TableExist(TableName: string): boolean;
    var
      sSQL: string;
    begin
      sSQL := Format('SELECT name FROM sqlite_master WHERE type=%s AND name=%s',
                     [QuotedStr('table'), QuotedStr(TableName)]);
      try
        SQLQuery1.SQL.Text := sSQL;
        SQLQuery1.Open;
        Result := not SQLQuery1.IsEmpty;
      finally
        SQLQuery1.Close;
      end;
    end;

  8. #8
    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
    Merci pour vos réponses mais comme je ne connais pas l'usage des composants que vous me proposez d'utiliser et que je n'ai pas trouvé de documentation en français les concernant, j'ai fait, à partir de vos indications, des essais pour tenter de trouver des écritures semblables avec le composant natif sqlite3Dataset et j'ai réussi.
    Donc je joins le texte de l'unité que j'ai créée, qui fait plusieurs choses :
    La première pour trouver les paramètres permettant d'utiliser l'application sous Linux ou Windows
    La deuxième pour avec les variables et constantes déclarées de tester la présence de la table JOURS
    si la réponse est fausse elle est créée et remplie
    si la réponse est vraie on la supprime.
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    var
      Fcreer: TFcreer;
      MQ,Q1,Q2:String;
      MINSTALLATION,MCHEMIN,MBASE:String;
      MMOIS,MJOURS:String;
      XMOIS,XJOURS,MINDEX:Integer;
      NB_JOURS:array [1..12] of integer;
    const
     MTABLE='CE.sdb';
     MNOUVELLE='JOURS';
    implementation
     
    {$R *.lfm}
     
    { TFcreer }
     
    procedure TFcreer.FormActivate(Sender: TObject);
    begin
      // préparation de l'environnement
      defaultFormatSettings.ShortDateFormat:='DD/MM/YYYY';
      defaultFormatSettings.DateSeparator:='/';
      defaultFormatSettings.DecimalSeparator:=',';
      Preparation;
    end;
     
    procedure TFcreer.BquitterClick(Sender: TObject);
    begin
      close;
    end;
     
    procedure TFcreer.Preparation;
    begin
    MINSTALLATION:=ExtractFilePath(Application.ExeName);
    MINDEX:=Pos('sources',MINSTALLATION);
    MCHEMIN:=Copy(MINSTALLATION,1,MINDEX-1);
    MINDEX:=Pos('\',MINSTALLATION);
      if MINDEX<>0 then MSEPARATEUR:='\' //WINDOWS
      else
      begin
      MINDEX:=Pos('/',MINSTALLATION);
        if MINDEX<>0 then MSEPARATEUR:='/' //LINUX
        else
        begin
        MMESSAGE:='Erreur de détection système d''exploitation';
        MessageErreur;
        Close;
        end;
      end;
    MBASE:=MCHEMIN+'tables'+MSEPARATEUR+MTABLE;
    // déclaration des valeurs jours du mois
    NB_JOURS[1]:=31; // janvier
    NB_JOURS[2]:=27; // février
    NB_JOURS[3]:=31; // mars
    NB_JOURS[4]:=30; // avril
    NB_JOURS[5]:=31; // mai
    NB_JOURS[6]:=30; // juin
    NB_JOURS[7]:=31; // juillet
    NB_JOURS[8]:=31; // août
    NB_JOURS[9]:=30; // septembre
    NB_JOURS[10]:=31; // octobre
    NB_JOURS[11]:=30; // novembre
    NB_JOURS[12]:=31; // décembre
    end;
     
    procedure TFcreer.Bcreer_suppClick(Sender: TObject);
    begin
    Sqlite3Dataset1.FileName:=MBASE;
      if Sqlite3Dataset1.TableExists=True then
      begin
     ShowMessage('la table JOURS existe elle va être supprimée');
      Sqlite3Dataset1.ExecSQL('DROP TABLE '+Sqlite3Dataset1.TableName+';');
      end
      else
      begin
      ShowMessage('La table JOURS n''existe pas dans la base, elle va être créée');
      MQ:=('CREATE TABLE JOURS (K_JOURS INTEGER PRIMARY KEY, MOIS char(2), JOURS char(2))');
      Sqlite3Dataset1.SQL:=MQ;
      Sqlite3Dataset1.ExecSQL;
      XMOIS:=1;
        while XMOIS<13 do
        begin
        MMOIS:=Trim(IntTostr(XMOIS));
        if Length(MMOIS)=1 then MMOIS:='0'+MMOIS;
        XJOURS:=NB_JOURS[XMOIS];
        MJOURS:=Trim(IntToStr(XJOURS));
        Q1:=quotedstr(MMOIS);
        Q2:=quotedstr(MJOURS);
        MQ:=('INSERT INTO JOURS  (K_JOURS,MOIS,JOURS) VALUES(NULL,'+Q1+','+Q2+')');
        Sqlite3Dataset1.SQL:=MQ;
        Sqlite3Dataset1.ExecSQL;
        Inc(XMOIS);
        end;
      end;
    end;
    Ces découvertes vont m'aider et je pense que cela peut être utile à d'autres ; je vais la mettre dans un nouveau message.
    Merci à vous A+

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/04/2011, 15h19
  2. Savoir si une table existe dans une base
    Par guznat dans le forum VB.NET
    Réponses: 6
    Dernier message: 26/01/2011, 15h11
  3. Tester si une table existe dans une base access
    Par codial dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/03/2007, 08h39
  4. comment savoir si une table existe dans la base?
    Par isa21493 dans le forum ASP
    Réponses: 6
    Dernier message: 01/09/2005, 17h09
  5. Réponses: 2
    Dernier message: 20/05/2005, 10h18

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