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+
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+
Bonjour,
On doit pouvoir exploiter le retour du SQL suivant :
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 PRAGMA table_info(table-name)
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 !
Salut,
Rapido, en interrogeant la table système sqlite_master:
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.
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;
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."
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 !
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+
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 !
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;
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.
Ces découvertes vont m'aider et je pense que cela peut être utile à d'autres ; je vais la mettre dans un nouveau message.
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;
Merci à vous A+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager