https://wiki.freepascal.org/api.php?action=feedcontributions&user=Cuniculophile&feedformat=atomLazarus wiki - User contributions [en]2024-03-28T12:44:07ZUser contributionsMediaWiki 1.35.6https://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63851SQLdb Tutorial1/fr2012-11-08T17:46:05Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Exemple simple|Exemple simple]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez devant les yeux une traduction de la [[SQLdb_Tutorial1|version anglaise]] du tutoriel, elle-même traduction de la [[SQLdb Tutorial1/de|version originale]] de [[User:Swen|Swen]] en allemand. La version anglaise a été enrichie en particulier dans la partie qui suit [[#Exemple simple|Exemple simple]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que.<br />
<br />
De Swen : Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63850SQLdb Tutorial1/fr2012-11-08T17:44:30Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Exemple simple|Exemple simple]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez devant les yeux une traduction de la version anglaise [[SQLdb_Tutorial1|version anglaise]] du tutoriel, elle-même traduction de la version originale [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]] en allemand. La version anglaise a été enrichie en particulier dans la partie qui suit [[#Exemple simple|Exemple simple]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que.<br />
<br />
De Swen : Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63849SQLdb Tutorial1/fr2012-11-08T17:44:01Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Exemple simple|Exemple simple]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez devant les yeux une traduction de la version anglaise [[SQLdb_Tutorial1|version anglaise] du tutoriel, elle-même traduction de la version originale [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]] en allemand. La version anglaise a été enrichie en particulier dans la partie qui suit [[#Exemple simple|Exemple simple]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que.<br />
<br />
De Swen : Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63848SQLdb Tutorial1/fr2012-11-08T17:42:18Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Exemple simple|Exemple simple]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez devant les yeux une traduction de la version anglaise du tutoriel, elle-même traduction de la version originale [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]] en allemand. La version anglaise a été enrichie en particulier dans la partie qui suit [[#Exemple simple|Exemple simple]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que.<br />
<br />
De Swen : Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63847SQLdb Tutorial1/fr2012-11-08T17:41:22Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Exemple simple|Exemple simple]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez devant les yeux une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], elle-même traduction de la version originale de [[User:Swen|Swen]] en allemand. La version anglaise a été enrichie en particulier dans la partie qui suit [[#Exemple simple|Exemple simple]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que.<br />
<br />
De Swen : Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63846SQLdb Tutorial1/fr2012-11-08T17:39:50Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Exemple simple|Exemple simple]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez devant les yeux une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], elle-même traduite de l'allemand. La version anglaise a été enrichie en particulier dans la partie qui suit [[#Exemple simple|Exemple simple]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que.<br />
<br />
De Swen : Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63845SQLdb Tutorial1/fr2012-11-08T17:37:04Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Exemple simple|Exemple simple]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], elle-même traduction de l'allemand et enrichie, en particulier dans la partie qui suit [[#Exemple simple|Exemple simple]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen : Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63844SQLdb Tutorial1/fr2012-11-08T17:36:19Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Exemple simple|Exemple simple]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], elle-même traduction de l'allemand et enrichie, en particulier dans la partie qui suit [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63843SQLdb Tutorial1/fr2012-11-08T17:35:37Z<p>Cuniculophile: /* Exemple basique */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Basic example|Basic example]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], elle-même traduction de l'allemand et enrichie, en particulier dans la partie qui suit [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple simple ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63842SQLdb Tutorial1/fr2012-11-08T17:35:13Z<p>Cuniculophile: /* Introduction */</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va montrer à l'aide d'un exemple comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Cependant si vous chercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
Cette exemple utilise Firebird avec sa base de données employee.fdb. Vous pouvez utiliser une autre base. Dans ce cas, les modifications à apporter vous seront signalées au fur et à mesure.<br />
<br />
Si ce texte semble long, c'est que chaque ligne du code nécessaire est expliquée en détails. En fait, la quantité de choses à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent survoler les instructions, ils comprendront rapidement de quoi il retourne.<br />
De plus, la première partie qui se termine par [[#Basic example|Basic example]] est suffisante pour disposer d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], elle-même traduction de l'allemand et enrichie, en particulier dans la partie qui suit [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple basique ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63841SQLdb Tutorial1/fr2012-11-08T17:29:08Z<p>Cuniculophile: </p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Si vous rechercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
C'est Firebird qui est mise en oeuvre ici avec la base de données employee.fdb. Vous pouvez utiliser una autre base. Les modifications nécessaires seront décrites au fur et à mesure.<br />
<br />
Si ce texte vous semble long, c'est que beaucoup d'explications sont données pour chacuen des lignes de code nécessaires. Au fond, la quantité de chose à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent jeter un œil rapide aux instructions, ils comprendront de quoi il retourne.<br />
Vous pouvez également vous contenter de la partie qui se termine par [[#Basic example|Basic example]]. Vous disposerez d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], qui a été enrichie, en particulier après [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple basique ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à faire simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
==== PostgreSQL ====<br />
Les choses sont très proche qu'avec Firebird. Le nom de la base de données n'a pas de chemin (de partie répertoire) - il suffit de préciser son nom (par ex. 'employee'). PostgreSQl n'a pas de mode embarqué, il est donc indispensable de renseigner la propriété ''HostName'' (nom du serveur) pour que la connexion de test fonctionne.<br />
<br />
==== SQLite ====<br />
Pour ce qui concerne SQLite, vous pouvez laisser les trois propriétés 'HostName', 'UserName', et 'Password' vides. Il faut remplir le nom du fichier SQLite dans 'DatabaseName', par ex. employee.sqlite. Attention : SQLite créera une base vide si le fichier n'existe pas.<br />
<br />
Vous devriez obtenir quelque chose comme l'écran suivant :<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Déterminer la partie des informations à afficher ===<br />
<br />
Bien que la connexion ait été réalisée, les données ne se sont pas affichée. La raison en est simple. Vous n'avez pas précisé au serveur ce qu'il devait vous renvoyer : La base de données employee.fdb contient plusieurs tables et nous n'avons pas informé Firebird quelle table nous voulions regarder. Si vous ne connaissez pas la structure de la base, vous pouvez utiliser des outils comme [http://www.flamerobin.org/index.php FlameRobin] pour afficher les contenus. Lazarus fournit également un outil - le DataDesktop. Vous le trouverez dans le sous-répertoire /tools/lazdatadesktop/ de Lazarus. Sauvegardez votre projet puis ouvrez le projet lazdatadesktop.lpi et compilez-le. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Retournons à notre exemple. <br />
<br />
Nous voulons afficher toutes les données de la table 'CUSTOMER'. Les instructions SQL pour ce faire sont :<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
Nous devons affecter cette commande à la propriété 'SQL' de SQLQuery1. Dans le code source de notre projet, ça devrait avoir cet air-là :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
Les instructions SQL doivent être entourées d'apostrophes (se sont des chaînes de caractères au format Pascal). Vous pouvez également lui assigner la valeur d'un autre composant (par ex. Edit1.Text). Ce n'est pas toujours une bonne idée; voir [[Secure programming]] (une documentation plus avancée) pour des informations sur l'injection de code SQL qui constitue un important risque de faille de sécurité.<br />
<br />
Ajoutons sur le formulaire un ''TButton'' (un bouton) depuis l'onglet 'Standard'. Quand l'utilisateur clique sur le bouton, l'extraction de données devrait commencer. Il va nous falloir écrire un peu de code pour faire ça. Double-cliquer sur Button1 (le bouton qu'on vient de placer sur le formulaire). Lazarus crée alors la procédure nécessaire. Nous trouverons dans notre code les lignes suivantes :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Entre ''begin'' et ''end'', vous devez taper les instructions nécessaire à l'affichage des données... ce qui a évidemment quelque chose à voir avec SQLQuery1.<br />
<br />
La propriété 'SQL' de SQLQUery1 peut seulement être modifiée quand SQL est inactive. C'est pourquoi nous fermons d'abord le composant :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Puis nous assignons notre instruction SQL à la propriété 'SQL', écrasant du même coup un éventuel contenu préalable :<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Il nous faut maintenant établir la connexion à la base, activer la transaction et ouvrir la requête :<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
Vous pouvez omettre les deux premières instruction, car elles seront automatiquement invoquées par la troisième. Si vous compiler le projet à ce point, vous pourrez déjà voir les données de la table 'CUSTOMER'. <br />
<br />
Toutefois, une application qui se veut sérieuse doit s'assurer que les connexions à la base de données sont proprement fermée quand elle ne sont plus utiles. Sinon des effets secondaires imprévisibles peuvent survenir. Donc, nous utilisons l'événement 'OnClose' du formulaire (créez-le en double-cliquant dans l'inspecteur d'objets :<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Pour fermer la connexion, nous utiliserons l'ordre inverse de l'ouverture :<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Résumé ==<br />
Jusqu'à maintenant, nous avons appris a connecté la base de données en utilisant le paquet SQLdb pour afficher le contenu d'une table sur l'écran.<br />
Si vous voulez ajouter plus de fonctionnalités, comme l'édition des données, vous pouvez continuer avec [[SQLdb Tutorial2]]<br />
<br />
Si vous avez suivi ces différentes étapes, votre code devrait ressemble à ceci :<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== Voir aussi ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63822SQLdb Tutorial1/fr2012-11-07T20:43:27Z<p>Cuniculophile: </p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Si vous rechercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
C'est Firebird qui est mise en oeuvre ici avec la base de données employee.fdb. Vous pouvez utiliser una autre base. Les modifications nécessaires seront décrites au fur et à mesure.<br />
<br />
Si ce texte vous semble long, c'est que beaucoup d'explications sont données pour chacuen des lignes de code nécessaires. Au fond, la quantité de chose à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent jeter un œil rapide aux instructions, ils comprendront de quoi il retourne.<br />
Vous pouvez également vous contenter de la partie qui se termine par [[#Basic example|Basic example]]. Vous disposerez d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], qui a été enrichie, en particulier après [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple basique ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Maintenant, il nous reste à relier nos composantes. Le moyen le plus simplie consiste à utiliser l'inspecteur d'obet, mais on peut également le faire dans le code source. <br />
<br />
Changez la propriété ''Transaction'' de DBConnection en 'SQLTransaction1'. Cela provoquera le changement automatique de la propriété ''Database'' de SQLTransaction1 en 'DBConnection'. <br />
<br />
Ensuite, changez la propriété ''Database'' de SQLQuery1 en 'DBConnection'. Lazarus ajuste automatiquement la valeur de la propriété 'Transaction'. <br />
<br />
Puis, changez la propriété ''Dataset'' de Datasource1 en 'SQLQuery1'. <br />
<br />
Et, pour finir, changez la propriété ''Datasource'' de DBGrid1 en 'Datasource1'.<br />
<br />
Nous voici avec une connexion qui relie sa transaction par défaut à un composant de transaction. Le composant transaction est reliépar sa propriété 'database' à l'objet de connexion. Ces deux composants sont suffisants pour réalisation la connexion et exécuter les instructions, mais insuffisants pour afficher des requêtes. Pour cela, on utilise le composant SQLQuery qui pointe sur la base de données (database) et fait le lien avec sa transaction par défaut. C'est avec le SQLQuery que nous extrairons plus tard les données et posterons en retour les données vers la base.<br />
<br />
Enfin, le composant 'datasource', qui est relié au composant requête, est une sorte d'interface. Il enregistre la position actuelle dans le dataset et les composants visuels utilisent cette information pour synchroniser l'affichage sur le même enregistrement.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
Si ça vous parait un peu obscur, ne vous inquiétez pas : encore un peu de travail et vous serez capables d'afficher vos premières données.<br />
<br />
=== Connexion avec la base de données ===<br />
Comment pouvons-nous afficher les données de notre base sur l'écran ?<br />
D'abord, nous devons informer DBConnection de l'endroit où se trouve la base employee.fdb (généralement dans le sous répertoires .../examples/empbuild/ de notre installation Firebird). Encore une fois, vous avez le choix : Vous pouvez utiliser l'inspecteur d'objets pour fixer le chemin ou le faire directement dans votre code.<br />
Nous choisissons d'utiliser l'inspecteur d'objet : Positionner la propriété 'HostName' de DBConnection sur le nom du serveur Firebird ou sur l'adresse IP. Utilisez 'localhost' si le serveur Firebird tourne sur votre machine de développement. Laissez le champ vide si vous utilisez un client Firebird embarqué.<br />
Positionner la propriété ''DatabaseName'' de DBConnection sur le chemin d'accès au fichier emplyee.fdb sur le serveur de base de données (par ex. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB sur une maachine Windows).<br />
Avant que le serveur de base de données ne permette l'accès au données, il vérifie que l'utilisateur et le mot de passe soient autorisés à le faire. Une base de données sérieuse demandera à l'utilisateur ces deux informations au démarrage de l'application, et l'enverra au serveur à la connexion.<br />
Toutefois, pour l'instant, de manière à rester simple, nous utiliserons encore l'inspecteur d'objets pour entrer ces informations ''en dur''. Changez le 'UserName' (nom d'utilisateur) en 'SYSDBA' et 'Password' (mot de passe) en 'masterkey' (bien sûr, faites les ajustements nécessaire si votre installation utilise un nom ou un mot de passe différent).<br />
<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63821SQLdb Tutorial1/fr2012-11-07T19:41:09Z<p>Cuniculophile: </p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Si vous rechercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
C'est Firebird qui est mise en oeuvre ici avec la base de données employee.fdb. Vous pouvez utiliser una autre base. Les modifications nécessaires seront décrites au fur et à mesure.<br />
<br />
Si ce texte vous semble long, c'est que beaucoup d'explications sont données pour chacuen des lignes de code nécessaires. Au fond, la quantité de chose à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent jeter un œil rapide aux instructions, ils comprendront de quoi il retourne.<br />
Vous pouvez également vous contenter de la partie qui se termine par [[#Basic example|Basic example]]. Vous disposerez d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], qui a été enrichie, en particulier après [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou de manière plus restrictive :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple basique ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Placez une ''TIBConnection'' (ou un composant de connexion équivalent) sur votre formulaire et changez son nom en ''DBConnection'' dans l'inspecteur d'objet. C'est généralement une bonne idée de changer le nom de vos composants pour quelque chose qui fait sens dans votre programme (Par ex. ''MainframeDBConnection'').<br />
<br />
Les deux autres composants, ''TSQLTransaction'' and ''TSQLQuery'', sont communs à toutes les types de bases qui peuvent être supportés par SQLdb.<br />
<br />
Pour afficher les données, utilisez un composant ''TDBGrid'' que vous trouverez dans l'onglet 'Data Controls'. Pour connecter ce composant à la base de données, on utilise un composant ''TDatasource'' qu'on trouve dans l'onglet 'Data Access'.<br />
<br />
Tous les composants nécessaires à notre premier exemple sont maintenant rassemblés. Vous pouvez agrandir le TDBGrid pour l'affichage de toutes les données.<br />
<br />
=== Relier les composants ===<br />
Next we need to connect our components. A very simple way is to use the object inspector, but you can also do this in your source code. <br />
<br />
Change the ''Transaction'' property of DBConnection to 'SQLTransaction1'. This causes the ''Database'' property of SQLTransaction1 to automatically change to 'DBConnection'. <br />
<br />
Then, change the ''Database'' property of SQLQuery1 to 'DBConnection'. Lazarus automatically adds the value for the 'Transaction' property. <br />
<br />
Next, change the ''Dataset'' property of Datasource1 to 'SQLQuery1'. <br />
<br />
Finally we change the ''Datasource'' property of DBGrid1 to 'Datasource1'.<br />
<br />
We now end up with a connection that links its default transaction to a transaction component. The transaction component links its database property to the connection object. These two components are enough to connect and execute instructions, but not enough to show queries. For this, SQLQuery component is used, which points to the database (and links to its default transaction). With the SQLQuery, we'll later on retrieve data and post it back to the database.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
If this is gibberish to you, don't despair: with just some more work, we'll be able to show our first data.<br />
<br />
=== Connecting to the database ===<br />
How can we now show the data from our database on the screen?<br />
First we need to tell DBConnection where the employee.fdb database is located (usually in the .../examples/empbuild/ subdirectory of your Firebird installation). Again you have the choice: you can use the object inspector to assign the path or do it directly in your source code.<br />
<br />
We choose to use the object inspector: set the DBConnection 'HostName' property to the Firebird server name or IP adddress. Use localhost if a Firebird server is running on your development machine; use a blank value if you use the embedded Firebird client.<br />
Change the ''DatabaseName'' property of DBConnection to the path to the employee.fdb file on the database server (e.g. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB on a Windows machine).<br />
<br />
Before the database server grants access to the data, it will check authorisation via username and password. A serious database application will ask the user for both values when the application is started, and send these to the server when connecting.<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63804SQLdb Tutorial1/fr2012-11-07T17:37:32Z<p>Cuniculophile: </p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Si vous rechercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
C'est Firebird qui est mise en oeuvre ici avec la base de données employee.fdb. Vous pouvez utiliser una autre base. Les modifications nécessaires seront décrites au fur et à mesure.<br />
<br />
Si ce texte vous semble long, c'est que beaucoup d'explications sont données pour chacuen des lignes de code nécessaires. Au fond, la quantité de chose à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent jeter un œil rapide aux instructions, ils comprendront de quoi il retourne.<br />
Vous pouvez également vous contenter de la partie qui se termine par [[#Basic example|Basic example]]. Vous disposerez d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], qui a été enrichie, en particulier après [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# Nous utilisons 'nano' comme éditeur, mais vous pouvez le remplacer par ce que vous voulez (comme vim, emacs, joe...) et le numéro de la version de postgres dépend de '/etc/postgresql/8.4/main/pg_hba.conf'.<br />
</syntaxhighlight><br />
<br />
Vérifier la présence d'une ligne qui ressemble à ceci (Remplacer 192.168.0.1 par l'étendue d'adresses IP de votre réseau local.<br />
<br />
<nowiki><br />
# Permettre l'acceès du réseau local en utilisant les mots de passe encodés md5 :<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Ou plus restritif :<br />
<br />
<nowiki><br />
# Permettre seulement l'accès à la base 'employee' à l'utilisateur 'employee' :<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
Si vous n'avez pas de ligne de ce type, ajoutez-la à la fin et sortez de votre éditeur.<br />
Pour plus d'information, reportez-vous à la documentation PostgreSQL.<br />
<br />
Rechargez les paramètres de PostgreSQL :<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
Puis<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Essayez le vous connecter à PostgreSQL. <br />
<br />
Note : Par défaut, PostgreSQL tente d'utiliser un socket qui ne permet pas l'usage d'un mot de passe. Pour circonvenir cette propension, nous spécifions le nom de l'hôte pour forcer une connexion TCP/IP :<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W # Connexion par TCP/IP. Précisez votre mot de passe.<br />
</syntaxhighlight><br />
<br />
Assurez-vous que les bibliothèques (dll sous WIndows et so sous Linus) sont bien installées - Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet.<br />
<br />
Compiler une fois votre projet, même vide, de façon à créer le répertoire de sortir et, sous Windows, copier les dlls dans ce répertoire.<br />
<br />
== Exemple Basic ==<br />
<br />
=== Projet et composants ===<br />
D'abord, il vous faut créer un nouveau projet Lazarus.<br />
<br />
Pour établir la connexion à votre base, vous avez besoin de une ''TIBConnection'', une ''TSQLTransaction'' et un composant ''[[Working With TSQLQuery|TSQLQuery]]'' que vous trouverez dans l'onglet 'SQLdb' de la palette de composants. <br />
<br />
''TIBConnection'' est me composant de connexion spécifique à Interbase/Firebird (Firebird est un fork d'Interbase).<br />
Si vous utilisez une base de données différente, remplacer ce composant par le composant approprié dans ce même onglet. Par exemple, une ''TSQLite3Connection'' pour une base SQLite, une ''PQConnection'' pour PostgreSQL. Les explications sur l'installation des bibliothèques d'accès à ces bases dépassent l'ambition de ce tutoriel et devrait être trouvées ailleurs (dans [[Databases]] par exemple).<br />
<br />
Click on the ''TIBConnection'' (or equivalent connection component) on your form, and in the Object Inspector, change the name to ''DBConnection''. This will simplify the rest of the tutorial when using different databases.<br />
It's also generally a good idea to name your components for something useful in your program (e.g. MainframeDBConnection) so you know what it stands for.<br />
<br />
The other two components, ''TSQLTransaction'' and ''TSQLQuery'', can be used for all databases that are supported by SQLdb.<br />
<br />
To display the data, we use a ''TDBGrid'' component, which can be found on the 'Data Controls' tab. To connect this component to the database components we need a ''TDatasource'' component from the 'Data Access' tab.<br />
<br />
Now we have all database components needed for the first example. You can enlarge the TDBGrid to have enough space to display all data.<br />
<br />
=== Link the components ===<br />
Next we need to connect our components. A very simple way is to use the object inspector, but you can also do this in your source code. <br />
<br />
Change the ''Transaction'' property of DBConnection to 'SQLTransaction1'. This causes the ''Database'' property of SQLTransaction1 to automatically change to 'DBConnection'. <br />
<br />
Then, change the ''Database'' property of SQLQuery1 to 'DBConnection'. Lazarus automatically adds the value for the 'Transaction' property. <br />
<br />
Next, change the ''Dataset'' property of Datasource1 to 'SQLQuery1'. <br />
<br />
Finally we change the ''Datasource'' property of DBGrid1 to 'Datasource1'.<br />
<br />
We now end up with a connection that links its default transaction to a transaction component. The transaction component links its database property to the connection object. These two components are enough to connect and execute instructions, but not enough to show queries. For this, SQLQuery component is used, which points to the database (and links to its default transaction). With the SQLQuery, we'll later on retrieve data and post it back to the database.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
If this is gibberish to you, don't despair: with just some more work, we'll be able to show our first data.<br />
<br />
=== Connecting to the database ===<br />
How can we now show the data from our database on the screen?<br />
First we need to tell DBConnection where the employee.fdb database is located (usually in the .../examples/empbuild/ subdirectory of your Firebird installation). Again you have the choice: you can use the object inspector to assign the path or do it directly in your source code.<br />
<br />
We choose to use the object inspector: set the DBConnection 'HostName' property to the Firebird server name or IP adddress. Use localhost if a Firebird server is running on your development machine; use a blank value if you use the embedded Firebird client.<br />
Change the ''DatabaseName'' property of DBConnection to the path to the employee.fdb file on the database server (e.g. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB on a Windows machine).<br />
<br />
Before the database server grants access to the data, it will check authorisation via username and password. A serious database application will ask the user for both values when the application is started, and send these to the server when connecting.<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63803SQLdb Tutorial1/fr2012-11-07T17:12:11Z<p>Cuniculophile: </p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Si vous rechercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
C'est Firebird qui est mise en oeuvre ici avec la base de données employee.fdb. Vous pouvez utiliser una autre base. Les modifications nécessaires seront décrites au fur et à mesure.<br />
<br />
Si ce texte vous semble long, c'est que beaucoup d'explications sont données pour chacuen des lignes de code nécessaires. Au fond, la quantité de chose à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent jeter un œil rapide aux instructions, ils comprendront de quoi il retourne.<br />
Vous pouvez également vous contenter de la partie qui se termine par [[#Basic example|Basic example]]. Vous disposerez d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], qui a été enrichie, en particulier après [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez utiliser l'utilitaire de votre distribution pour installer les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
ou<br />
<bash><br />
sudo apt-get -yqq install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en œuvre une autre base de données, voici ce dont la table dont vous devrez disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Lapinou software', 'Lanion', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # Démarrage immédiat de l'interpréteur SQL psql<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- Bien sûr, adaptez le mot de passe à votre convenance<br />
-- Un message comme 'CREATE ROLE' devrait sanctionner votre succès.<br />
-- Pour changer votre mot de passe a posteriori, utilisez quelque chose comme :<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- Supprimons la date d'expiration du mot de passe. Ce n'est pas indispensable :<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Maintenant, ajoutons un peu de sécurité,<br />
-- interdisons à l'utilisateur de créer une base de données ou d'autres comptes utilisateurs :<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; -- Restriction de la création d'objet<br />
-- La réponse devrait être quelque chose comme 'ALTER ROLE'.<br />
-- Création de notre base de données :<br />
CREATE DATABASE employee;<br />
-- Réponse : 'CREATE DATABASE'.<br />
-- Assignons tous les droits sur la base funambol à l'utilisateur 'employee' :<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- Allocation des droits<br />
-- La réponse devrait être quelque chose comme 'GRANT'.<br />
-- Nous créons la tbla à l'aide du type de données 'serial', numérotation automatique :<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Maintenant collons les lignes INSERT ci-dessus. Vérifions la saisie avec :<br />
SELECT * FROM customer;<br />
-- Sortons de là :<br />
\q <br />
</syntaxhighlight><br />
<br />
Maintenant, nous devrions être sous le shell, connecté en tant que utilisateur postgres.<br />
<br />
Si votre serveur se trouve sur une machine distante, vérifiez la bon accès réseau à cette machine. Voyez les détails dans la documentation postgresql, mais quelque chose comme ça devrait marcher :<br />
<syntaxhighlight lang=bash><br />
# please adjust nano (e.g. use vim,emacs,joe...) and the postgres version number depending on situation<br />
nano /etc/postgresql/8.4/main/pg_hba.conf<br />
</syntaxhighlight><br />
<br />
Verify if there is a line like - NOTE: replace 192.168.0.1 with your own LAN ip address range<br />
<br />
<nowiki><br />
#allow access from local network using md5 hashed passwords:<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
or more restrictive:<br />
<br />
<nowiki><br />
# only allow network access to the employee database by the employee user<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
If there isn't such a line, add the line at the end, save and close your editor.<br />
See PostgreSQL documentation for more details.<br />
<br />
Reload PostgreSQL settings:<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
then<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Test logging in to PostgreSQL. <br />
<br />
Note: by default PostgreSQL tries an ident/unix domain socket login which doesn't allow passwords. So we specify a host to force TCP/IP login:<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W #Log in via tcp/ip. enter your db password<br />
</syntaxhighlight><br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dllsinto that directory.<br />
<br />
== Basic example ==<br />
<br />
=== Project and components ===<br />
First you should create a new Lazarus project.<br />
<br />
To get access to our database we need one ''TIBConnection'', one ''TSQLTransaction'' and one ''[[Working With TSQLQuery|TSQLQuery]]'' component from the 'SQLdb' tab in the component palette. <br />
<br />
''TIBConnection'' is an Interbase/Firebird specific connection component.<br />
If you are using a different database, substitute the proper component from the 'SQLDB' tab, e.g. a ''TSQLite3Connection'' for an SQLite database, ''PQConnection'' for a PostgreSQL database. Discussion of setting up any database access libraries is out of scope for this tutorial; see e.g. [[Databases]] for that.<br />
<br />
Click on the ''TIBConnection'' (or equivalent connection component) on your form, and in the Object Inspector, change the name to ''DBConnection''. This will simplify the rest of the tutorial when using different databases.<br />
It's also generally a good idea to name your components for something useful in your program (e.g. MainframeDBConnection) so you know what it stands for.<br />
<br />
The other two components, ''TSQLTransaction'' and ''TSQLQuery'', can be used for all databases that are supported by SQLdb.<br />
<br />
To display the data, we use a ''TDBGrid'' component, which can be found on the 'Data Controls' tab. To connect this component to the database components we need a ''TDatasource'' component from the 'Data Access' tab.<br />
<br />
Now we have all database components needed for the first example. You can enlarge the TDBGrid to have enough space to display all data.<br />
<br />
=== Link the components ===<br />
Next we need to connect our components. A very simple way is to use the object inspector, but you can also do this in your source code. <br />
<br />
Change the ''Transaction'' property of DBConnection to 'SQLTransaction1'. This causes the ''Database'' property of SQLTransaction1 to automatically change to 'DBConnection'. <br />
<br />
Then, change the ''Database'' property of SQLQuery1 to 'DBConnection'. Lazarus automatically adds the value for the 'Transaction' property. <br />
<br />
Next, change the ''Dataset'' property of Datasource1 to 'SQLQuery1'. <br />
<br />
Finally we change the ''Datasource'' property of DBGrid1 to 'Datasource1'.<br />
<br />
We now end up with a connection that links its default transaction to a transaction component. The transaction component links its database property to the connection object. These two components are enough to connect and execute instructions, but not enough to show queries. For this, SQLQuery component is used, which points to the database (and links to its default transaction). With the SQLQuery, we'll later on retrieve data and post it back to the database.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
If this is gibberish to you, don't despair: with just some more work, we'll be able to show our first data.<br />
<br />
=== Connecting to the database ===<br />
How can we now show the data from our database on the screen?<br />
First we need to tell DBConnection where the employee.fdb database is located (usually in the .../examples/empbuild/ subdirectory of your Firebird installation). Again you have the choice: you can use the object inspector to assign the path or do it directly in your source code.<br />
<br />
We choose to use the object inspector: set the DBConnection 'HostName' property to the Firebird server name or IP adddress. Use localhost if a Firebird server is running on your development machine; use a blank value if you use the embedded Firebird client.<br />
Change the ''DatabaseName'' property of DBConnection to the path to the employee.fdb file on the database server (e.g. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB on a Windows machine).<br />
<br />
Before the database server grants access to the data, it will check authorisation via username and password. A serious database application will ask the user for both values when the application is started, and send these to the server when connecting.<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63802SQLdb Tutorial1/fr2012-11-07T16:54:23Z<p>Cuniculophile: </p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Si vous rechercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
C'est Firebird qui est mise en oeuvre ici avec la base de données employee.fdb. Vous pouvez utiliser una autre base. Les modifications nécessaires seront décrites au fur et à mesure.<br />
<br />
Si ce texte vous semble long, c'est que beaucoup d'explications sont données pour chacuen des lignes de code nécessaires. Au fond, la quantité de chose à taper n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent jeter un œil rapide aux instructions, ils comprendront de quoi il retourne.<br />
Vous pouvez également vous contenter de la partie qui se termine par [[#Basic example|Basic example]]. Vous disposerez d'un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], qui a été enrichie, en particulier après [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et entreprendre une nouvelle traduction allemande.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vous devez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et la base exemple 'employee'.<br />
<br />
Vous pouvez préférer une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les biblothèques Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faudra les DLLs Firebird, éventuellement dans votre répertoire système, mais de préférence dans le répertoire de votre projet (pendant le développement, dans l'IDE) et dans le répertoire de sortie où est produit l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez trouver ces DLLs sur cette page : Firebird Embedded 2.5 [http://www.firebirdsql.org/en/firebird-2-5/].<br />
Décompressez les fichiers dans votre répertoire applicatif :<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Renommez fbembed.dll en fbclient.dll (c'est le nom ordinaire du client Firebird). La DLL fournie peut également faire fonction de client ordinaire Firebird.<br />
<br />
Assurez-vous que la base de données employee.fdb se trouve bien dans le répertoire de votre projet.<br />
<br />
Enfin, recompilez une fois votre projet (même vide) pour créer le répertoire de sortie et y copier les DLLs.<br />
<br />
=== Les bases de données Firebird sur les autres systèmes ===<br />
<br />
Sous Linux/OSX, il vous faut également les bibliothèques partagées du client Firebird.<br />
Sous Linux, vous pouvez l'installer avec l'utilitaire de votre distribution pour obtenir les paquets, comme sous Debian :<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
<br />
=== Si Firebird ou employee.fdb ne sont pas installés ===<br />
<br />
Si vous ne disposez pas de la base de données exemple 'employee' ou si vous mettez en oeuvre une autre base de données, voici ce dont la table devra disposer pour notre exemple :<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Voici un peu de données pour qu'on voit quelque chose :<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Michael Design', 'San Diego', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Merci de créer la base, la table et d'insérer les données dans votre environnement.<br />
<br />
==== SQLite ====<br />
Si vous utilisez SQLite, vous pouvez créer la base susmentionnée dans le répertoire de votre projet en lançant le code suivant : <br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Il suffit maintenant de copier/coller les instructions 'CREATE TABLE' et 'INSERT' ci-dessus.<br />
Pour tester si les données sont correctement entrée, utilisez la requête :<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
Terminer la session à l'aide de la commande : .quit<br />
Un fichier du nom de 'employee.sqlite' devrait être disponible dans le répertoire de votre projet.<br />
<br />
Assurez-vous que les bibliothèques sqlite (dll sous Windows et so sous Linux) sont installées (Par ex. sous Windows, 'sqlite3.dll' devrait se trouver dans le répertoire de votre projet).<br />
<br />
Compilez une fois votre projet, même vide, pour que soit créer le répertoire de sortie et, sous Windows, copier les DLLs et la base 'employee.sqlite' dans ce répertoire.<br />
<br />
==== PostgreSQL ====<br />
La présente section suppose que vous utilisez un serveur Linux et le shell. Des étapes similaires aboutiront au même résultat sous Windows avec un outil graphique comme pgadmin.<br />
Connectez-vous à votre serveur et basculez sous le compte postgres :<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # immediately start up psql SQL interpreter<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- of course, adjust password to taste<br />
-- something like 'CREATE ROLE' should appear indicating success.<br />
-- to later change the password you can use something like<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- We're going to let the password never expire; if you want more security, you can leave this step out:<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Now we're tightening it up a bit again:<br />
-- Don't allow user to create a database or create other users:<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; --restrict object creation<br />
-- something like 'ALTER ROLE' should appear indicating success.<br />
-- Create our database:<br />
CREATE DATABASE employee;<br />
-- something like CREATE DATABASE should appear indicating success.<br />
-- Assign all privileges on database funambol to user employee:<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- allow user full permissions to database<br />
-- something like GRANT should appear indicating success.<br />
-- We create the table using a serial datatype - aka autonumber/autoincrement:<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Now copy and paste the above INSERT statements. To test if the right data is present, enter this query: <br />
SELECT * FROM customer;<br />
--Exit out of psql:<br />
\q <br />
</syntaxhighlight><br />
<br />
Now you should be on a shell logged in as the postgres user.<br />
<br />
If your server is on another machine than your development machine, make sure you allow network access to the database. See your postgresql documentation for details, but something like this should work:<br />
<syntaxhighlight lang=bash><br />
# please adjust nano (e.g. use vim,emacs,joe...) and the postgres version number depending on situation<br />
nano /etc/postgresql/8.4/main/pg_hba.conf<br />
</syntaxhighlight><br />
<br />
Verify if there is a line like - NOTE: replace 192.168.0.1 with your own LAN ip address range<br />
<br />
<nowiki><br />
#allow access from local network using md5 hashed passwords:<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
or more restrictive:<br />
<br />
<nowiki><br />
# only allow network access to the employee database by the employee user<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
If there isn't such a line, add the line at the end, save and close your editor.<br />
See PostgreSQL documentation for more details.<br />
<br />
Reload PostgreSQL settings:<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
then<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Test logging in to PostgreSQL. <br />
<br />
Note: by default PostgreSQL tries an ident/unix domain socket login which doesn't allow passwords. So we specify a host to force TCP/IP login:<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W #Log in via tcp/ip. enter your db password<br />
</syntaxhighlight><br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dllsinto that directory.<br />
<br />
== Basic example ==<br />
<br />
=== Project and components ===<br />
First you should create a new Lazarus project.<br />
<br />
To get access to our database we need one ''TIBConnection'', one ''TSQLTransaction'' and one ''[[Working With TSQLQuery|TSQLQuery]]'' component from the 'SQLdb' tab in the component palette. <br />
<br />
''TIBConnection'' is an Interbase/Firebird specific connection component.<br />
If you are using a different database, substitute the proper component from the 'SQLDB' tab, e.g. a ''TSQLite3Connection'' for an SQLite database, ''PQConnection'' for a PostgreSQL database. Discussion of setting up any database access libraries is out of scope for this tutorial; see e.g. [[Databases]] for that.<br />
<br />
Click on the ''TIBConnection'' (or equivalent connection component) on your form, and in the Object Inspector, change the name to ''DBConnection''. This will simplify the rest of the tutorial when using different databases.<br />
It's also generally a good idea to name your components for something useful in your program (e.g. MainframeDBConnection) so you know what it stands for.<br />
<br />
The other two components, ''TSQLTransaction'' and ''TSQLQuery'', can be used for all databases that are supported by SQLdb.<br />
<br />
To display the data, we use a ''TDBGrid'' component, which can be found on the 'Data Controls' tab. To connect this component to the database components we need a ''TDatasource'' component from the 'Data Access' tab.<br />
<br />
Now we have all database components needed for the first example. You can enlarge the TDBGrid to have enough space to display all data.<br />
<br />
=== Link the components ===<br />
Next we need to connect our components. A very simple way is to use the object inspector, but you can also do this in your source code. <br />
<br />
Change the ''Transaction'' property of DBConnection to 'SQLTransaction1'. This causes the ''Database'' property of SQLTransaction1 to automatically change to 'DBConnection'. <br />
<br />
Then, change the ''Database'' property of SQLQuery1 to 'DBConnection'. Lazarus automatically adds the value for the 'Transaction' property. <br />
<br />
Next, change the ''Dataset'' property of Datasource1 to 'SQLQuery1'. <br />
<br />
Finally we change the ''Datasource'' property of DBGrid1 to 'Datasource1'.<br />
<br />
We now end up with a connection that links its default transaction to a transaction component. The transaction component links its database property to the connection object. These two components are enough to connect and execute instructions, but not enough to show queries. For this, SQLQuery component is used, which points to the database (and links to its default transaction). With the SQLQuery, we'll later on retrieve data and post it back to the database.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
If this is gibberish to you, don't despair: with just some more work, we'll be able to show our first data.<br />
<br />
=== Connecting to the database ===<br />
How can we now show the data from our database on the screen?<br />
First we need to tell DBConnection where the employee.fdb database is located (usually in the .../examples/empbuild/ subdirectory of your Firebird installation). Again you have the choice: you can use the object inspector to assign the path or do it directly in your source code.<br />
<br />
We choose to use the object inspector: set the DBConnection 'HostName' property to the Firebird server name or IP adddress. Use localhost if a Firebird server is running on your development machine; use a blank value if you use the embedded Firebird client.<br />
Change the ''DatabaseName'' property of DBConnection to the path to the employee.fdb file on the database server (e.g. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB on a Windows machine).<br />
<br />
Before the database server grants access to the data, it will check authorisation via username and password. A serious database application will ask the user for both values when the application is started, and send these to the server when connecting.<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63801SQLdb Tutorial1/fr2012-11-07T16:16:09Z<p>Cuniculophile: </p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Si vous rechercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
C'est Firebird qui est mise en œuvre ici avec la base de données employee.fdb. Vous pouvez utiliser une autre base. Ça impliquera des modifications qui seront décrite au cours du texte..<br />
<br />
Si ce texte vous semble long, c'est que beaucoup d'explications sont données pour chaque ligne de code nécessaire. Au fond, la quantité de chose nécessaire n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent jeter un oeil rapide aux instructions et comprendre de quoi il retourne.<br />
Vous pouvez également vous contenter de la partie qui se termine par [[#Basic example|Basic example]]. Vous aurez un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], qui a été enrichie, en particulier après [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et baser une nouvelle traduction allemande sur ceci.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utilisez une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Il vous faut également disposer d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et d'utiliser la base exemple 'employee'.<br />
<br />
Vous pouvez également utiliser une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Les bibliothèques de base de données Firebird sous Windows ===<br />
<br />
Sous Windows, il vous faut disposer des DLLs clientes de Firebird, éventuellement dans votre répertoire 'system', mais de préférence dans le répertoire de votre projet (pendant le développement dans l'IDE) et dans le répertoire de génération de l'exécutable (pour faire tourner le programme compilé).<br />
Vous pouvez obtenir aisément ces DLLs : download Firebird Embedded 2.5 from [http://www.firebirdsql.org/en/firebird-2-5/]<br />
Extract these files to your application directory:<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Rename fbembed.dll to fbclient.dll (the name for a regular, client-server Firebird client). The embedded Firebird DLL can also act as a regular Firebird client.<br />
<br />
Make sure the employee.fdb database is in your project directory.<br />
<br />
Finally, compile your project (even if it empty) once to create the output directory, and copy the dlls, as well as the employee.fdb database, into that directory.<br />
<br />
=== Firebird database libraries on other systems ===<br />
<br />
On Linux/OSX, you will also need the Firebird client shared libraries.<br />
On Linux you can use your distribution's method of getting programs to get the Firebird client packages, e.g. on Debian:<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
<br />
=== No Firebird or employee.fdb installed? ===<br />
<br />
If you don't have the employee sample database installed or are using a different database, here is a minimal version of the table we'll be using:<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Some data so you can at least show something:<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Michael Design', 'San Diego', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Please create the database, table and insert the data in your database environment.<br />
<br />
==== SQLite ====<br />
If you are using SQLite, you can create the database mentioned above in your project directory by running the sqlite executable:<br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Now copy and paste the above CREATE TABLE and INSERT statements.<br />
To test if the right data is present, enter this query:<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
End your session with .quit<br />
A file called employee.sqlite should now be created in your project directory.<br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dll, as well as the employee.sqlite database, into that directory.<br />
<br />
==== PostgreSQL ====<br />
This section assumes you're using a Linux server and the shell; comparable steps can be done using Windows and GUI tools such as pgadmin<br />
Log in to your server and switch to the postgres account:<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # immediately start up psql SQL interpreter<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- of course, adjust password to taste<br />
-- something like 'CREATE ROLE' should appear indicating success.<br />
-- to later change the password you can use something like<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- We're going to let the password never expire; if you want more security, you can leave this step out:<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Now we're tightening it up a bit again:<br />
-- Don't allow user to create a database or create other users:<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; --restrict object creation<br />
-- something like 'ALTER ROLE' should appear indicating success.<br />
-- Create our database:<br />
CREATE DATABASE employee;<br />
-- something like CREATE DATABASE should appear indicating success.<br />
-- Assign all privileges on database funambol to user employee:<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- allow user full permissions to database<br />
-- something like GRANT should appear indicating success.<br />
-- We create the table using a serial datatype - aka autonumber/autoincrement:<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Now copy and paste the above INSERT statements. To test if the right data is present, enter this query: <br />
SELECT * FROM customer;<br />
--Exit out of psql:<br />
\q <br />
</syntaxhighlight><br />
<br />
Now you should be on a shell logged in as the postgres user.<br />
<br />
If your server is on another machine than your development machine, make sure you allow network access to the database. See your postgresql documentation for details, but something like this should work:<br />
<syntaxhighlight lang=bash><br />
# please adjust nano (e.g. use vim,emacs,joe...) and the postgres version number depending on situation<br />
nano /etc/postgresql/8.4/main/pg_hba.conf<br />
</syntaxhighlight><br />
<br />
Verify if there is a line like - NOTE: replace 192.168.0.1 with your own LAN ip address range<br />
<br />
<nowiki><br />
#allow access from local network using md5 hashed passwords:<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
or more restrictive:<br />
<br />
<nowiki><br />
# only allow network access to the employee database by the employee user<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
If there isn't such a line, add the line at the end, save and close your editor.<br />
See PostgreSQL documentation for more details.<br />
<br />
Reload PostgreSQL settings:<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
then<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Test logging in to PostgreSQL. <br />
<br />
Note: by default PostgreSQL tries an ident/unix domain socket login which doesn't allow passwords. So we specify a host to force TCP/IP login:<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W #Log in via tcp/ip. enter your db password<br />
</syntaxhighlight><br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dllsinto that directory.<br />
<br />
== Basic example ==<br />
<br />
=== Project and components ===<br />
First you should create a new Lazarus project.<br />
<br />
To get access to our database we need one ''TIBConnection'', one ''TSQLTransaction'' and one ''[[Working With TSQLQuery|TSQLQuery]]'' component from the 'SQLdb' tab in the component palette. <br />
<br />
''TIBConnection'' is an Interbase/Firebird specific connection component.<br />
If you are using a different database, substitute the proper component from the 'SQLDB' tab, e.g. a ''TSQLite3Connection'' for an SQLite database, ''PQConnection'' for a PostgreSQL database. Discussion of setting up any database access libraries is out of scope for this tutorial; see e.g. [[Databases]] for that.<br />
<br />
Click on the ''TIBConnection'' (or equivalent connection component) on your form, and in the Object Inspector, change the name to ''DBConnection''. This will simplify the rest of the tutorial when using different databases.<br />
It's also generally a good idea to name your components for something useful in your program (e.g. MainframeDBConnection) so you know what it stands for.<br />
<br />
The other two components, ''TSQLTransaction'' and ''TSQLQuery'', can be used for all databases that are supported by SQLdb.<br />
<br />
To display the data, we use a ''TDBGrid'' component, which can be found on the 'Data Controls' tab. To connect this component to the database components we need a ''TDatasource'' component from the 'Data Access' tab.<br />
<br />
Now we have all database components needed for the first example. You can enlarge the TDBGrid to have enough space to display all data.<br />
<br />
=== Link the components ===<br />
Next we need to connect our components. A very simple way is to use the object inspector, but you can also do this in your source code. <br />
<br />
Change the ''Transaction'' property of DBConnection to 'SQLTransaction1'. This causes the ''Database'' property of SQLTransaction1 to automatically change to 'DBConnection'. <br />
<br />
Then, change the ''Database'' property of SQLQuery1 to 'DBConnection'. Lazarus automatically adds the value for the 'Transaction' property. <br />
<br />
Next, change the ''Dataset'' property of Datasource1 to 'SQLQuery1'. <br />
<br />
Finally we change the ''Datasource'' property of DBGrid1 to 'Datasource1'.<br />
<br />
We now end up with a connection that links its default transaction to a transaction component. The transaction component links its database property to the connection object. These two components are enough to connect and execute instructions, but not enough to show queries. For this, SQLQuery component is used, which points to the database (and links to its default transaction). With the SQLQuery, we'll later on retrieve data and post it back to the database.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
If this is gibberish to you, don't despair: with just some more work, we'll be able to show our first data.<br />
<br />
=== Connecting to the database ===<br />
How can we now show the data from our database on the screen?<br />
First we need to tell DBConnection where the employee.fdb database is located (usually in the .../examples/empbuild/ subdirectory of your Firebird installation). Again you have the choice: you can use the object inspector to assign the path or do it directly in your source code.<br />
<br />
We choose to use the object inspector: set the DBConnection 'HostName' property to the Firebird server name or IP adddress. Use localhost if a Firebird server is running on your development machine; use a blank value if you use the embedded Firebird client.<br />
Change the ''DatabaseName'' property of DBConnection to the path to the employee.fdb file on the database server (e.g. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB on a Windows machine).<br />
<br />
Before the database server grants access to the data, it will check authorisation via username and password. A serious database application will ask the user for both values when the application is started, and send these to the server when connecting.<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1/fr&diff=63800SQLdb Tutorial1/fr2012-11-07T16:07:38Z<p>Cuniculophile: Created page with "{{SQLdb Tutorial}} == Introduction == Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le SQLdb Package. Il a été conçu pour des d..."</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
Le présent tutoriel va vous montrer à l'aide d'exemples comment mettre en pratique le [[SQLdb Package]]. Il a été conçu pour des débutants. Si vous rechercher de l'aide pour les bases de données et SQL, vous n'êtes pas au bon endroit. <br />
C'est Firebird qui est mise en oeuvre ici avec la base de données employee.fdb. Vous pouvez utiliser una autre base. Ça impliquera des modifications qui seront décrite au cours du texte..<br />
<br />
Si ce texte vous semble long, c'est que beaucoup d'explications sont données pour chaque ligne de code nécessaire. Au fond, la quantité de chose nécessaire n'est pas si grande qu'il y parait. Les développeurs expérimentés peuvent jeter un oeil rapide aux instructions et comprendre de quoi il retourne.<br />
Vous pouvez également vous contenter de la partie qui se termine par [[#Basic example|Basic example]]. Vous aurez un programme fonctionnel.<br />
<br />
Vous avez, devant les yeux, une traduction de la version anglaise du tutoriel [[SQLdb Tutorial1/de|German tutorial]] de [[User:Swen|Swen]], qui a été enrichie, en particulier après [[#Basic example|Basic example]]. [[User:Swen|Swen]] souhaite que la version allemande reste tel que. Si c'est une problème pour vous, vous pouvez la renommer et baser une nouvelle traduction allemande sur ceci.<br />
<br />
De Swen: Merci à [[User:Loesje|Joost]] et Michael, sans qui tout cela n'aurait probablement pas été possible.<br />
<br />
== Prérequis ==<br />
<br />
Si vous le pouvez, utiliser une version récente de Lazarus version (FPC 2.2.2 ou supérieure). Si le paquet SQLdb n'est pas installé, faites-le maintenant (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Vousdevez disposer également d'une base de données relationnelle SQL, comme [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (si possible en version 2.0 ou supérieure). Le plus simple est d'utiliser les valeurs par défaut (par ex. utilisateur : SYSDBA et mot de passer masterkey) et d'utiliser la base exemple 'employee'.<br />
<br />
Vous pouvez mettre en œuvre une autre base de données (MySQL, PostgreSQL, Oracle, SQLite ou une autre base interfacée par ODBC) : il vous faudra seulement disposer de la bonne structure base/table (voir ci-dessous) et utiliser le ''TSQLConnector'' approprié (voir ci-dessous également). Si les transactions de votre base sont très différentes, merci de documenter la section correspondante.<br />
Les notes au sujet de SQLite ont été commencé.<br />
<br />
=== Firebird database libraries on Windows ===<br />
<br />
Finally, on Windows you will need to have the Firebird client DLLs present, optionally in your system directory, but preferably in your project directory (for design time support in the IDE) and in the output directory where the executable is (to run the compiled program).<br />
One easy way to get the client DLLs is: download Firebird Embedded 2.5 from<br />
[http://www.firebirdsql.org/en/firebird-2-5/]<br />
Extract these files to your application directory:<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Rename fbembed.dll to fbclient.dll (the name for a regular, client-server Firebird client). The embedded Firebird DLL can also act as a regular Firebird client.<br />
<br />
Make sure the employee.fdb database is in your project directory.<br />
<br />
Finally, compile your project (even if it empty) once to create the output directory, and copy the dlls, as well as the employee.fdb database, into that directory.<br />
<br />
=== Firebird database libraries on other systems ===<br />
<br />
On Linux/OSX, you will also need the Firebird client shared libraries.<br />
On Linux you can use your distribution's method of getting programs to get the Firebird client packages, e.g. on Debian:<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
<br />
=== No Firebird or employee.fdb installed? ===<br />
<br />
If you don't have the employee sample database installed or are using a different database, here is a minimal version of the table we'll be using:<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Some data so you can at least show something:<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Michael Design', 'San Diego', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Please create the database, table and insert the data in your database environment.<br />
<br />
==== SQLite ====<br />
If you are using SQLite, you can create the database mentioned above in your project directory by running the sqlite executable:<br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Now copy and paste the above CREATE TABLE and INSERT statements.<br />
To test if the right data is present, enter this query:<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
End your session with .quit<br />
A file called employee.sqlite should now be created in your project directory.<br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dll, as well as the employee.sqlite database, into that directory.<br />
<br />
==== PostgreSQL ====<br />
This section assumes you're using a Linux server and the shell; comparable steps can be done using Windows and GUI tools such as pgadmin<br />
Log in to your server and switch to the postgres account:<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # immediately start up psql SQL interpreter<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- of course, adjust password to taste<br />
-- something like 'CREATE ROLE' should appear indicating success.<br />
-- to later change the password you can use something like<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- We're going to let the password never expire; if you want more security, you can leave this step out:<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Now we're tightening it up a bit again:<br />
-- Don't allow user to create a database or create other users:<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; --restrict object creation<br />
-- something like 'ALTER ROLE' should appear indicating success.<br />
-- Create our database:<br />
CREATE DATABASE employee;<br />
-- something like CREATE DATABASE should appear indicating success.<br />
-- Assign all privileges on database funambol to user employee:<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- allow user full permissions to database<br />
-- something like GRANT should appear indicating success.<br />
-- We create the table using a serial datatype - aka autonumber/autoincrement:<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Now copy and paste the above INSERT statements. To test if the right data is present, enter this query: <br />
SELECT * FROM customer;<br />
--Exit out of psql:<br />
\q <br />
</syntaxhighlight><br />
<br />
Now you should be on a shell logged in as the postgres user.<br />
<br />
If your server is on another machine than your development machine, make sure you allow network access to the database. See your postgresql documentation for details, but something like this should work:<br />
<syntaxhighlight lang=bash><br />
# please adjust nano (e.g. use vim,emacs,joe...) and the postgres version number depending on situation<br />
nano /etc/postgresql/8.4/main/pg_hba.conf<br />
</syntaxhighlight><br />
<br />
Verify if there is a line like - NOTE: replace 192.168.0.1 with your own LAN ip address range<br />
<br />
<nowiki><br />
#allow access from local network using md5 hashed passwords:<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
or more restrictive:<br />
<br />
<nowiki><br />
# only allow network access to the employee database by the employee user<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
If there isn't such a line, add the line at the end, save and close your editor.<br />
See PostgreSQL documentation for more details.<br />
<br />
Reload PostgreSQL settings:<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
then<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Test logging in to PostgreSQL. <br />
<br />
Note: by default PostgreSQL tries an ident/unix domain socket login which doesn't allow passwords. So we specify a host to force TCP/IP login:<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W #Log in via tcp/ip. enter your db password<br />
</syntaxhighlight><br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dllsinto that directory.<br />
<br />
== Basic example ==<br />
<br />
=== Project and components ===<br />
First you should create a new Lazarus project.<br />
<br />
To get access to our database we need one ''TIBConnection'', one ''TSQLTransaction'' and one ''[[Working With TSQLQuery|TSQLQuery]]'' component from the 'SQLdb' tab in the component palette. <br />
<br />
''TIBConnection'' is an Interbase/Firebird specific connection component.<br />
If you are using a different database, substitute the proper component from the 'SQLDB' tab, e.g. a ''TSQLite3Connection'' for an SQLite database, ''PQConnection'' for a PostgreSQL database. Discussion of setting up any database access libraries is out of scope for this tutorial; see e.g. [[Databases]] for that.<br />
<br />
Click on the ''TIBConnection'' (or equivalent connection component) on your form, and in the Object Inspector, change the name to ''DBConnection''. This will simplify the rest of the tutorial when using different databases.<br />
It's also generally a good idea to name your components for something useful in your program (e.g. MainframeDBConnection) so you know what it stands for.<br />
<br />
The other two components, ''TSQLTransaction'' and ''TSQLQuery'', can be used for all databases that are supported by SQLdb.<br />
<br />
To display the data, we use a ''TDBGrid'' component, which can be found on the 'Data Controls' tab. To connect this component to the database components we need a ''TDatasource'' component from the 'Data Access' tab.<br />
<br />
Now we have all database components needed for the first example. You can enlarge the TDBGrid to have enough space to display all data.<br />
<br />
=== Link the components ===<br />
Next we need to connect our components. A very simple way is to use the object inspector, but you can also do this in your source code. <br />
<br />
Change the ''Transaction'' property of DBConnection to 'SQLTransaction1'. This causes the ''Database'' property of SQLTransaction1 to automatically change to 'DBConnection'. <br />
<br />
Then, change the ''Database'' property of SQLQuery1 to 'DBConnection'. Lazarus automatically adds the value for the 'Transaction' property. <br />
<br />
Next, change the ''Dataset'' property of Datasource1 to 'SQLQuery1'. <br />
<br />
Finally we change the ''Datasource'' property of DBGrid1 to 'Datasource1'.<br />
<br />
We now end up with a connection that links its default transaction to a transaction component. The transaction component links its database property to the connection object. These two components are enough to connect and execute instructions, but not enough to show queries. For this, SQLQuery component is used, which points to the database (and links to its default transaction). With the SQLQuery, we'll later on retrieve data and post it back to the database.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
If this is gibberish to you, don't despair: with just some more work, we'll be able to show our first data.<br />
<br />
=== Connecting to the database ===<br />
How can we now show the data from our database on the screen?<br />
First we need to tell DBConnection where the employee.fdb database is located (usually in the .../examples/empbuild/ subdirectory of your Firebird installation). Again you have the choice: you can use the object inspector to assign the path or do it directly in your source code.<br />
<br />
We choose to use the object inspector: set the DBConnection 'HostName' property to the Firebird server name or IP adddress. Use localhost if a Firebird server is running on your development machine; use a blank value if you use the embedded Firebird client.<br />
Change the ''DatabaseName'' property of DBConnection to the path to the employee.fdb file on the database server (e.g. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB on a Windows machine).<br />
<br />
Before the database server grants access to the data, it will check authorisation via username and password. A serious database application will ask the user for both values when the application is started, and send these to the server when connecting.<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1_(Fran%C3%A7ais)&diff=63799SQLdb Tutorial1 (Français)2012-11-07T15:18:45Z<p>Cuniculophile: moved SQLdb Tutorial1 (Français) to SQLdb Tutorial1 over redirect</p>
<hr />
<div>#REDIRECT [[SQLdb Tutorial1]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1&diff=63798SQLdb Tutorial12012-11-07T15:18:45Z<p>Cuniculophile: moved SQLdb Tutorial1 (Français) to SQLdb Tutorial1 over redirect</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
This tutorial shows you how to program databases using practical example code based on the [[SQLdb Package]]. It is primarily targeted at newbies. If somebody is looking for basics about databases and SQL, he should read relevant books/documentation. <br />
For this tutorial I use Firebird with the example database employee.fdb. Other databases can also be used; some adjustments will need to be made which are mentioned in the text.<br />
<br />
While this tutorial may seem long, it mostly is just a lot of text that explains why you should type what you type. As you can see at the end, the amount of actual code you will need for a working application is not that great. More experienced developers will hopefully be able to glance through the instructions and quickly understand what's going on.<br />
Also, you can stop at the end of the [[#Basic example|Basic example]] chapter and have a working program.<br />
<br />
This tutorial is based on a [[SQLdb Tutorial1/de|German tutorial]] by [[User:Swen|Swen]], but it is extended, especially after the [[#Basic example|Basic example]]. [[User:Swen|Swen]] wants the German version to remain as-is. If this is a problem, we can rename this version and base a new German translation on that.<br />
<br />
From Swen: thanks to [[User:Loesje|Joost]] and Michael. Without their help this tutorial probably never would have come about.<br />
<br />
== Requirements ==<br />
<br />
If possible you should use a recent Lazarus version (with FPC 2.2.2 or newer) for this tutorial. If the SQLdb package isn't already installed, you should do it now (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Furthermore you need an SQL/relational database, such as [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (if possible version 2.0 or newer). It's easiest if you use standard settings (e.g user name SYSDBA and password masterkey), and that you have the employee sample database installed.<br />
<br />
You can use another database (e.g. MySQL, PostgreSQL, Oracle, SQLite or another database using ODBC): you'd have to have the proper database/table structure (see below), and use the relevant ''TSQLConnector'' descendant (also indicated below). If your database has significant differences regarding transactions etc. please make a note in the relevant section.<br />
Notes on SQLite have been started.<br />
<br />
=== Firebird database libraries on Windows ===<br />
<br />
Finally, on Windows you will need to have the Firebird client DLLs present, optionally in your system directory, but preferably in your project directory (for design time support in the IDE) and in the output directory where the executable is (to run the compiled program).<br />
One easy way to get the client DLLs is: download Firebird Embedded 2.5 from<br />
[http://www.firebirdsql.org/en/firebird-2-5/]<br />
Extract these files to your application directory:<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Rename fbembed.dll to fbclient.dll (the name for a regular, client-server Firebird client). The embedded Firebird DLL can also act as a regular Firebird client.<br />
<br />
Make sure the employee.fdb database is in your project directory.<br />
<br />
Finally, compile your project (even if it empty) once to create the output directory, and copy the dlls, as well as the employee.fdb database, into that directory.<br />
<br />
=== Firebird database libraries on other systems ===<br />
<br />
On Linux/OSX, you will also need the Firebird client shared libraries.<br />
On Linux you can use your distribution's method of getting programs to get the Firebird client packages, e.g. on Debian:<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
<br />
=== No Firebird or employee.fdb installed? ===<br />
<br />
If you don't have the employee sample database installed or are using a different database, here is a minimal version of the table we'll be using:<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Some data so you can at least show something:<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Michael Design', 'San Diego', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Please create the database, table and insert the data in your database environment.<br />
<br />
==== SQLite ====<br />
If you are using SQLite, you can create the database mentioned above in your project directory by running the sqlite executable:<br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Now copy and paste the above CREATE TABLE and INSERT statements.<br />
To test if the right data is present, enter this query:<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
End your session with .quit<br />
A file called employee.sqlite should now be created in your project directory.<br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dll, as well as the employee.sqlite database, into that directory.<br />
<br />
==== PostgreSQL ====<br />
This section assumes you're using a Linux server and the shell; comparable steps can be done using Windows and GUI tools such as pgadmin<br />
Log in to your server and switch to the postgres account:<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # immediately start up psql SQL interpreter<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- of course, adjust password to taste<br />
-- something like 'CREATE ROLE' should appear indicating success.<br />
-- to later change the password you can use something like<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- We're going to let the password never expire; if you want more security, you can leave this step out:<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Now we're tightening it up a bit again:<br />
-- Don't allow user to create a database or create other users:<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; --restrict object creation<br />
-- something like 'ALTER ROLE' should appear indicating success.<br />
-- Create our database:<br />
CREATE DATABASE employee;<br />
-- something like CREATE DATABASE should appear indicating success.<br />
-- Assign all privileges on database funambol to user employee:<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- allow user full permissions to database<br />
-- something like GRANT should appear indicating success.<br />
-- We create the table using a serial datatype - aka autonumber/autoincrement:<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Now copy and paste the above INSERT statements. To test if the right data is present, enter this query: <br />
SELECT * FROM customer;<br />
--Exit out of psql:<br />
\q <br />
</syntaxhighlight><br />
<br />
Now you should be on a shell logged in as the postgres user.<br />
<br />
If your server is on another machine than your development machine, make sure you allow network access to the database. See your postgresql documentation for details, but something like this should work:<br />
<syntaxhighlight lang=bash><br />
# please adjust nano (e.g. use vim,emacs,joe...) and the postgres version number depending on situation<br />
nano /etc/postgresql/8.4/main/pg_hba.conf<br />
</syntaxhighlight><br />
<br />
Verify if there is a line like - NOTE: replace 192.168.0.1 with your own LAN ip address range<br />
<br />
<nowiki><br />
#allow access from local network using md5 hashed passwords:<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
or more restrictive:<br />
<br />
<nowiki><br />
# only allow network access to the employee database by the employee user<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
If there isn't such a line, add the line at the end, save and close your editor.<br />
See PostgreSQL documentation for more details.<br />
<br />
Reload PostgreSQL settings:<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
then<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Test logging in to PostgreSQL. <br />
<br />
Note: by default PostgreSQL tries an ident/unix domain socket login which doesn't allow passwords. So we specify a host to force TCP/IP login:<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W #Log in via tcp/ip. enter your db password<br />
</syntaxhighlight><br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dllsinto that directory.<br />
<br />
== Basic example ==<br />
<br />
=== Project and components ===<br />
First you should create a new Lazarus project.<br />
<br />
To get access to our database we need one ''TIBConnection'', one ''TSQLTransaction'' and one ''[[Working With TSQLQuery|TSQLQuery]]'' component from the 'SQLdb' tab in the component palette. <br />
<br />
''TIBConnection'' is an Interbase/Firebird specific connection component.<br />
If you are using a different database, substitute the proper component from the 'SQLDB' tab, e.g. a ''TSQLite3Connection'' for an SQLite database, ''PQConnection'' for a PostgreSQL database. Discussion of setting up any database access libraries is out of scope for this tutorial; see e.g. [[Databases]] for that.<br />
<br />
Click on the ''TIBConnection'' (or equivalent connection component) on your form, and in the Object Inspector, change the name to ''DBConnection''. This will simplify the rest of the tutorial when using different databases.<br />
It's also generally a good idea to name your components for something useful in your program (e.g. MainframeDBConnection) so you know what it stands for.<br />
<br />
The other two components, ''TSQLTransaction'' and ''TSQLQuery'', can be used for all databases that are supported by SQLdb.<br />
<br />
To display the data, we use a ''TDBGrid'' component, which can be found on the 'Data Controls' tab. To connect this component to the database components we need a ''TDatasource'' component from the 'Data Access' tab.<br />
<br />
Now we have all database components needed for the first example. You can enlarge the TDBGrid to have enough space to display all data.<br />
<br />
=== Link the components ===<br />
Next we need to connect our components. A very simple way is to use the object inspector, but you can also do this in your source code. <br />
<br />
Change the ''Transaction'' property of DBConnection to 'SQLTransaction1'. This causes the ''Database'' property of SQLTransaction1 to automatically change to 'DBConnection'. <br />
<br />
Then, change the ''Database'' property of SQLQuery1 to 'DBConnection'. Lazarus automatically adds the value for the 'Transaction' property. <br />
<br />
Next, change the ''Dataset'' property of Datasource1 to 'SQLQuery1'. <br />
<br />
Finally we change the ''Datasource'' property of DBGrid1 to 'Datasource1'.<br />
<br />
We now end up with a connection that links its default transaction to a transaction component. The transaction component links its database property to the connection object. These two components are enough to connect and execute instructions, but not enough to show queries. For this, SQLQuery component is used, which points to the database (and links to its default transaction). With the SQLQuery, we'll later on retrieve data and post it back to the database.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
If this is gibberish to you, don't despair: with just some more work, we'll be able to show our first data.<br />
<br />
=== Connecting to the database ===<br />
How can we now show the data from our database on the screen?<br />
First we need to tell DBConnection where the employee.fdb database is located (usually in the .../examples/empbuild/ subdirectory of your Firebird installation). Again you have the choice: you can use the object inspector to assign the path or do it directly in your source code.<br />
<br />
We choose to use the object inspector: set the DBConnection 'HostName' property to the Firebird server name or IP adddress. Use localhost if a Firebird server is running on your development machine; use a blank value if you use the embedded Firebird client.<br />
Change the ''DatabaseName'' property of DBConnection to the path to the employee.fdb file on the database server (e.g. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB on a Windows machine).<br />
<br />
Before the database server grants access to the data, it will check authorisation via username and password. A serious database application will ask the user for both values when the application is started, and send these to the server when connecting.<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophilehttps://wiki.freepascal.org/index.php?title=SQLdb_Tutorial1&diff=63796SQLdb Tutorial12012-11-07T15:18:10Z<p>Cuniculophile: moved SQLdb Tutorial1 to SQLdb Tutorial1 (Français): Je n'ai pas trouvé comment signifier qu'il s'agissait d'une traduction</p>
<hr />
<div>{{SQLdb Tutorial}}<br />
<br />
== Introduction ==<br />
<br />
This tutorial shows you how to program databases using practical example code based on the [[SQLdb Package]]. It is primarily targeted at newbies. If somebody is looking for basics about databases and SQL, he should read relevant books/documentation. <br />
For this tutorial I use Firebird with the example database employee.fdb. Other databases can also be used; some adjustments will need to be made which are mentioned in the text.<br />
<br />
While this tutorial may seem long, it mostly is just a lot of text that explains why you should type what you type. As you can see at the end, the amount of actual code you will need for a working application is not that great. More experienced developers will hopefully be able to glance through the instructions and quickly understand what's going on.<br />
Also, you can stop at the end of the [[#Basic example|Basic example]] chapter and have a working program.<br />
<br />
This tutorial is based on a [[SQLdb Tutorial1/de|German tutorial]] by [[User:Swen|Swen]], but it is extended, especially after the [[#Basic example|Basic example]]. [[User:Swen|Swen]] wants the German version to remain as-is. If this is a problem, we can rename this version and base a new German translation on that.<br />
<br />
From Swen: thanks to [[User:Loesje|Joost]] and Michael. Without their help this tutorial probably never would have come about.<br />
<br />
== Requirements ==<br />
<br />
If possible you should use a recent Lazarus version (with FPC 2.2.2 or newer) for this tutorial. If the SQLdb package isn't already installed, you should do it now (Package -> Install/Uninstall packages ... -> SQLDBLaz 1.0.1).<br />
<br />
Furthermore you need an SQL/relational database, such as [http://sourceforge.net/project/showfiles.php?group_id=9028 Firebird] (if possible version 2.0 or newer). It's easiest if you use standard settings (e.g user name SYSDBA and password masterkey), and that you have the employee sample database installed.<br />
<br />
You can use another database (e.g. MySQL, PostgreSQL, Oracle, SQLite or another database using ODBC): you'd have to have the proper database/table structure (see below), and use the relevant ''TSQLConnector'' descendant (also indicated below). If your database has significant differences regarding transactions etc. please make a note in the relevant section.<br />
Notes on SQLite have been started.<br />
<br />
=== Firebird database libraries on Windows ===<br />
<br />
Finally, on Windows you will need to have the Firebird client DLLs present, optionally in your system directory, but preferably in your project directory (for design time support in the IDE) and in the output directory where the executable is (to run the compiled program).<br />
One easy way to get the client DLLs is: download Firebird Embedded 2.5 from<br />
[http://www.firebirdsql.org/en/firebird-2-5/]<br />
Extract these files to your application directory:<br />
<syntaxhighlight lang="bash"><br />
fbembed.dll<br />
firebird.msg<br />
ib_util.dll<br />
icudt30.dll<br />
icuin30.dll<br />
icuuc30.dll<br />
Microsoft.VC80.CRT.manifest<br />
msvcp80.dll<br />
msvcr80.dll<br />
</syntaxhighlight><br />
Rename fbembed.dll to fbclient.dll (the name for a regular, client-server Firebird client). The embedded Firebird DLL can also act as a regular Firebird client.<br />
<br />
Make sure the employee.fdb database is in your project directory.<br />
<br />
Finally, compile your project (even if it empty) once to create the output directory, and copy the dlls, as well as the employee.fdb database, into that directory.<br />
<br />
=== Firebird database libraries on other systems ===<br />
<br />
On Linux/OSX, you will also need the Firebird client shared libraries.<br />
On Linux you can use your distribution's method of getting programs to get the Firebird client packages, e.g. on Debian:<br />
<bash><br />
aptitude install libfbclient2<br />
</bash><br />
<br />
=== No Firebird or employee.fdb installed? ===<br />
<br />
If you don't have the employee sample database installed or are using a different database, here is a minimal version of the table we'll be using:<br />
<syntaxhighlight lang="sql"><br />
CREATE TABLE CUSTOMER<br />
(<br />
CUST_NO INTEGER NOT NULL,<br />
CUSTOMER VARCHAR(25) NOT NULL,<br />
CITY VARCHAR(25),<br />
COUNTRY VARCHAR(15),<br />
CONSTRAINT INTEG_60 PRIMARY KEY (CUST_NO)<br />
);<br />
</syntaxhighlight><br />
<br />
Some data so you can at least show something:<br />
<syntaxhighlight lang="sql"><br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('1', 'Michael Design', 'San Diego', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('2', 'VC Technologies', 'Dallas', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('3', 'Klämpfl, Van Canneyt and Co.', 'Boston', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('4', 'Felipe Bank', 'Manchester', 'England');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('5', 'Joost Systems, LTD.', 'Central Hong Kong', 'Hong Kong');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('6', 'Van der Voort Int.', 'Ottawa', 'Canada');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('7', 'Mrs. Mauvais', 'Pebble Beach', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('8', 'Asinine Vacation Rentals', 'Lihue', 'USA');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('9', 'Fax', 'Turtle Island', 'Fiji');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('10', 'FPC Corporation', 'Tokyo', 'Japan');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('11', 'Dynamic Intelligence Corp', 'Zurich', 'Switzerland');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('12', '3D-Pad Corp.', 'Paris', 'France');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('13', 'Swen Export, Ltd.', 'Milan', 'Italy');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('14', 'Graeme Consulting', 'Brussels', 'Belgium');<br />
INSERT INTO CUSTOMER (CUST_NO, CUSTOMER, CITY, COUNTRY) VALUES ('15', 'Klenin Inc.', 'Den Haag', 'Netherlands');<br />
</syntaxhighlight><br />
<br />
Please create the database, table and insert the data in your database environment.<br />
<br />
==== SQLite ====<br />
If you are using SQLite, you can create the database mentioned above in your project directory by running the sqlite executable:<br />
<syntaxhighlight lang="bash"><br />
sqlite employee.sqlite<br />
</syntaxhighlight><br />
Now copy and paste the above CREATE TABLE and INSERT statements.<br />
To test if the right data is present, enter this query:<br />
<syntaxhighlight lang="SQL"><br />
select * from customer;<br />
</syntaxhighlight><br />
End your session with .quit<br />
A file called employee.sqlite should now be created in your project directory.<br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dll, as well as the employee.sqlite database, into that directory.<br />
<br />
==== PostgreSQL ====<br />
This section assumes you're using a Linux server and the shell; comparable steps can be done using Windows and GUI tools such as pgadmin<br />
Log in to your server and switch to the postgres account:<br />
<syntaxhighlight lang=bash><br />
su - postgres -c psql # immediately start up psql SQL interpreter<br />
</syntaxhighlight><br />
<br />
Create a user for the database and the tables:<br />
<syntaxhighlight lang=SQL><br />
CREATE USER employee WITH PASSWORD 'hellopassword'; -- of course, adjust password to taste<br />
-- something like 'CREATE ROLE' should appear indicating success.<br />
-- to later change the password you can use something like<br />
-- alter user employee with password '<newpasswordhere>';<br />
-- We're going to let the password never expire; if you want more security, you can leave this step out:<br />
ALTER USER employee VALID UNTIL 'infinity'; --password never expires<br />
-- Now we're tightening it up a bit again:<br />
-- Don't allow user to create a database or create other users:<br />
ALTER USER employee NOCREATEDB NOCREATEUSER; --restrict object creation<br />
-- something like 'ALTER ROLE' should appear indicating success.<br />
-- Create our database:<br />
CREATE DATABASE employee;<br />
-- something like CREATE DATABASE should appear indicating success.<br />
-- Assign all privileges on database funambol to user employee:<br />
GRANT ALL PRIVILEGES ON DATABASE employee TO employee; -- allow user full permissions to database<br />
-- something like GRANT should appear indicating success.<br />
-- We create the table using a serial datatype - aka autonumber/autoincrement:<br />
CREATE TABLE customer<br />
(<br />
cust_no serial NOT NULL,<br />
customer character varying(25) NOT NULL,<br />
city character varying(25),<br />
country character varying(15),<br />
CONSTRAINT integ_60 PRIMARY KEY (cust_no )<br />
);<br />
-- Now copy and paste the above INSERT statements. To test if the right data is present, enter this query: <br />
SELECT * FROM customer;<br />
--Exit out of psql:<br />
\q <br />
</syntaxhighlight><br />
<br />
Now you should be on a shell logged in as the postgres user.<br />
<br />
If your server is on another machine than your development machine, make sure you allow network access to the database. See your postgresql documentation for details, but something like this should work:<br />
<syntaxhighlight lang=bash><br />
# please adjust nano (e.g. use vim,emacs,joe...) and the postgres version number depending on situation<br />
nano /etc/postgresql/8.4/main/pg_hba.conf<br />
</syntaxhighlight><br />
<br />
Verify if there is a line like - NOTE: replace 192.168.0.1 with your own LAN ip address range<br />
<br />
<nowiki><br />
#allow access from local network using md5 hashed passwords:<br />
<br />
host all all 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
or more restrictive:<br />
<br />
<nowiki><br />
# only allow network access to the employee database by the employee user<br />
<br />
host employee employee 192.168.0.1/24 md5<br />
</nowiki><br />
<br />
If there isn't such a line, add the line at the end, save and close your editor.<br />
See PostgreSQL documentation for more details.<br />
<br />
Reload PostgreSQL settings:<br />
<syntaxhighlight lang=bash> <br />
psql<br />
</syntaxhighlight><br />
then<br />
<syntaxhighlight lang=bash> <br />
SELECT pg_reload_conf(); --reload settings...<br />
-- ...and exit back to shell:<br />
\q<br />
</syntaxhighlight><br />
<br />
Test logging in to PostgreSQL. <br />
<br />
Note: by default PostgreSQL tries an ident/unix domain socket login which doesn't allow passwords. So we specify a host to force TCP/IP login:<br />
<syntaxhighlight lang=bash><br />
psql -h 127.0.0.1 -d employee -U employee -W #Log in via tcp/ip. enter your db password<br />
</syntaxhighlight><br />
<br />
Make sure the required sqlite dll/so is installed - e.g. on Windows, sqlite3.dll should be present in your project directory.<br />
<br />
Compile your project (even if it is empty) once to create the output directory, and (on Windows) copy the dllsinto that directory.<br />
<br />
== Basic example ==<br />
<br />
=== Project and components ===<br />
First you should create a new Lazarus project.<br />
<br />
To get access to our database we need one ''TIBConnection'', one ''TSQLTransaction'' and one ''[[Working With TSQLQuery|TSQLQuery]]'' component from the 'SQLdb' tab in the component palette. <br />
<br />
''TIBConnection'' is an Interbase/Firebird specific connection component.<br />
If you are using a different database, substitute the proper component from the 'SQLDB' tab, e.g. a ''TSQLite3Connection'' for an SQLite database, ''PQConnection'' for a PostgreSQL database. Discussion of setting up any database access libraries is out of scope for this tutorial; see e.g. [[Databases]] for that.<br />
<br />
Click on the ''TIBConnection'' (or equivalent connection component) on your form, and in the Object Inspector, change the name to ''DBConnection''. This will simplify the rest of the tutorial when using different databases.<br />
It's also generally a good idea to name your components for something useful in your program (e.g. MainframeDBConnection) so you know what it stands for.<br />
<br />
The other two components, ''TSQLTransaction'' and ''TSQLQuery'', can be used for all databases that are supported by SQLdb.<br />
<br />
To display the data, we use a ''TDBGrid'' component, which can be found on the 'Data Controls' tab. To connect this component to the database components we need a ''TDatasource'' component from the 'Data Access' tab.<br />
<br />
Now we have all database components needed for the first example. You can enlarge the TDBGrid to have enough space to display all data.<br />
<br />
=== Link the components ===<br />
Next we need to connect our components. A very simple way is to use the object inspector, but you can also do this in your source code. <br />
<br />
Change the ''Transaction'' property of DBConnection to 'SQLTransaction1'. This causes the ''Database'' property of SQLTransaction1 to automatically change to 'DBConnection'. <br />
<br />
Then, change the ''Database'' property of SQLQuery1 to 'DBConnection'. Lazarus automatically adds the value for the 'Transaction' property. <br />
<br />
Next, change the ''Dataset'' property of Datasource1 to 'SQLQuery1'. <br />
<br />
Finally we change the ''Datasource'' property of DBGrid1 to 'Datasource1'.<br />
<br />
We now end up with a connection that links its default transaction to a transaction component. The transaction component links its database property to the connection object. These two components are enough to connect and execute instructions, but not enough to show queries. For this, SQLQuery component is used, which points to the database (and links to its default transaction). With the SQLQuery, we'll later on retrieve data and post it back to the database.<br />
<br />
Finally, the datasource component, which is linked to the query component, is a sort of place holder. It keeps track of where in the query dataset we are and the GUI components are linked to that so they all show the same record.<br />
<br />
If this is gibberish to you, don't despair: with just some more work, we'll be able to show our first data.<br />
<br />
=== Connecting to the database ===<br />
How can we now show the data from our database on the screen?<br />
First we need to tell DBConnection where the employee.fdb database is located (usually in the .../examples/empbuild/ subdirectory of your Firebird installation). Again you have the choice: you can use the object inspector to assign the path or do it directly in your source code.<br />
<br />
We choose to use the object inspector: set the DBConnection 'HostName' property to the Firebird server name or IP adddress. Use localhost if a Firebird server is running on your development machine; use a blank value if you use the embedded Firebird client.<br />
Change the ''DatabaseName'' property of DBConnection to the path to the employee.fdb file on the database server (e.g. C:\Program Files\Firebird\Firebird_2_0\examples\empbuild\EMPLOYEE.FDB on a Windows machine).<br />
<br />
Before the database server grants access to the data, it will check authorisation via username and password. A serious database application will ask the user for both values when the application is started, and send these to the server when connecting.<br />
<br />
However, for now, to simplify matters, we use the object inspector again to hard code these. Change the 'UserName' property to 'SYSDBA' and 'Password' to 'masterkey' (of course, adjust if your database installation has a different username/password). <br />
<br />
Now check if all settings so far are correct: set the 'Connected' property to 'True'. If the database path isn't correct or if username or password are wrong, you will get an error message. If the connection was successful, you should cut it now (set 'Connected' to 'False').<br />
<br />
==== PostgreSQL ====<br />
The situation with PostgreSQL is very similar to that on Firebird. The database name does not have a path - you just specify a name part (e.g. 'employee'). PostgreSQL has no embedded mode, so you need to fill out the ''HostName'' property for the connection test to work.<br />
<br />
==== SQLite ====<br />
For SQLite, you can leave the 'HostName', 'UserName', and 'Password' properties empty. Set the 'DatabaseName' to the name of your SQLite file, e.g. employee.sqlite. Note: sqlite will create the database specified if it doesn't exist, so be careful here.<br />
<br />
You should now have something like the following screenshot - todo: this screenshot is actually further along, we only have a button now:<br />
[[Image:SQLTut1ComponentsSetUp.png|framed|center|Form and components set up]]<br />
<br />
=== Choosing what data to show ===<br />
<br />
Although the connection was successful, no data was displayed. The reason is simple. We haven't told the database server which data to return: the employee.fdb database contains several tables, and we haven't told Firebird the table we want to see. If you don't know the structure of a database, you can use tools like [http://www.flamerobin.org/index.php FlameRobin], to display the contents. Lazarus also provides such a tool - the DataDesktop. You can find it in the /tools/lazdatadesktop/ subdirectory of Lazarus. Save our project and then open the project lazdatadesktop.lpi and compile it. <br />
<br />
[[Image:DataDictonary1.png|framed|center|The DataDesktop in action]]<br />
<br />
Back to our example. <br />
<br />
We want to display all data from the table 'CUSTOMER'. The SQL instruction for that is:<br />
<syntaxhighlight lang="sql"><br />
select * from CUSTOMER<br />
</syntaxhighlight> <br />
<br />
We need to assign this command to the 'SQL' property of SQLQuery1. In the source code of our project this would look like:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
The SQL instruction must be enclosed by single quotes. You also have the ability to assign the content of another component (e.g. Edit1.Text). This is not always a good idea; see [[Secure programming]] (a more advanced text) for details on SQL injection.<br />
<br />
Let's add a ''TButton'' from the 'Standard' tab on the form. When the user clicks on the button, data retrieval should start. <br />
We will need some code for this. Double click on Button1. Lazarus then creates the skeleton of the necessary procedure. In our source code we should find the following lines:<br />
<br />
<syntaxhighlight><br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
Between ''begin'' and ''end'' we must enter the instructions needed to display the data.... obviuosly that will be something to do with SQLQuery1..<br />
<br />
The 'SQL' property of SQLQuery1 can only be changed, if SQLQuery1 is not active. That's why we close the component first:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
</syntaxhighlight><br />
Then we assign our SQL instruction to the 'SQL' property, overwriting any previous SQL commands:<br />
<syntaxhighlight><br />
SQLQuery1.SQL.Text := 'select * from CUSTOMER';<br />
</syntaxhighlight><br />
<br />
Now we need to establish the connection to the database, activate the transaction and open the query:<br />
<syntaxhighlight><br />
DBConnection.Connected := True;<br />
SQLTransaction1.Active := True;<br />
SQLQuery1.Open;<br />
</syntaxhighlight><br />
You can omit the first two instructions, because they are done automatically by the third instruction. If you compile the project at this point, you could already see the data from the 'CUSTOMER' table. <br />
<br />
However, a serious application must make sure that all open database connections are properly closed when not needed anymore. Otherwise the secondary effects would not be foreseeable. So, we use the OnClose event of our form (create it with a double click in the object inspector):<br />
<br />
<syntaxhighlight><br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
<br />
end; <br />
</syntaxhighlight><br />
<br />
To close the connection we use the reverse order compared to our opening code:<br />
<syntaxhighlight><br />
SQLQuery1.Close;<br />
SQLTransaction1.Active := False;<br />
DBConnection.Connected := False;<br />
</syntaxhighlight><br />
<br />
== Summary ==<br />
Up to now we have learned how to connect to a database using the SQLdb package and how to display the contents of a table on the screen.<br />
If you want to add more functionality such as editing, please continue with [[SQLdb Tutorial2]]<br />
<br />
If you followed the previous steps, then your code should look like:<br />
<syntaxhighlight><br />
unit Unit1; <br />
<br />
{$mode objfpc}{$H+}<br />
<br />
interface<br />
<br />
uses<br />
Classes, SysUtils, IBConnection, sqldb, db, FileUtil, Forms, Controls,<br />
Graphics, Dialogs, DBGrids, StdCtrls;<br />
<br />
type<br />
<br />
{ TForm1 }<br />
<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Datasource1: TDatasource;<br />
DBGrid1: TDBGrid;<br />
DBConnection: TIBConnection;<br />
SQLQuery1: TSQLQuery;<br />
SQLTransaction1: TSQLTransaction;<br />
procedure Button1Click(Sender: TObject);<br />
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
private<br />
{ private declarations }<br />
public<br />
{ public declarations }<br />
end; <br />
<br />
var<br />
Form1: TForm1; <br />
<br />
implementation<br />
<br />
{$R *.lfm}<br />
<br />
{ TForm1 }<br />
<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
SQLQuery1.Close;<br />
SQLQuery1.SQL.Text:= 'select * from CUSTOMER';<br />
DBConnection.Connected:= True;<br />
SQLTransaction1.Active:= True;<br />
SQLQuery1.Open;<br />
end;<br />
<br />
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);<br />
begin<br />
SQLQuery1.Close;<br />
SQLTransaction1.Active:= False;<br />
DBConnection.Connected:= False;<br />
end;<br />
<br />
end. <br />
</syntaxhighlight><br />
<br />
<br />
== See also ==<br />
* [[SQLdb Tutorial2]]: Second part of this tutorial, showing editing, inserting etc.<br />
* [[Lazarus Database Overview]]: Information about the databases that Lazarus supports. Links to database-specific notes.<br />
* [[SQLdb Package]]: information about the SQLdb package<br />
* [[SQLdb Programming Reference]]: an overview of the interaction of the SQLdb database components<br />
* [[SqlDBHowto]]: information about using the SQLdb package<br />
* [[Working With TSQLQuery]]: information about TSQLQuery<br />
<br />
[[Category:Databases]]<br />
[[Category:Tutorials]]<br />
[[Category:Lazarus]]</div>Cuniculophile