Copie du wikimiroir

Ceci est un miroir du wiki de pascal.chat. La modification, l’historique et la connexion se trouvent là-bas.

Firebird/fr

English · Français · Русский · 日本語


Portail de la base de données
Références: · Information générale · Bibliothèques · Types de champ · Contrôles · FAQ · Comment faire en SQL ? · Travailler avec TSQLQuery · Applications de base de données en mémoire · Tutoriels/articles pratiques : · Vue d'ensemble · 0 - Configuration de la base de données · 1 - Commençons · 2 - Edition · 3 - Requêtes · 4 - Modules de données · Référence de programmation SQLdb · Bases de données · Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

Il s'agit d'un guide sur l'utilisation de la base de données Firebird dans Lazarus/FPC, en utilisant Firebird avec SQLdb (la bibliothèque de base de données intégrée dans Lazarus/FPC). D'autres méthodes d'accès sont décrites dans Autres bibliothèques Firebird.

Vue d'ensemble

Firebird est un serveur de bases de données, open source qui est utilisé et développé depuis des décennies (il s'est développé à partir d'Interbase 6 passé en Open source par Borland). Il inclut une prise en charge riche des ordres SQL (p.ex. INSERT...RETURNING), des procédures stockées, des déclencheurs (triggers), etc. Vous pouvez écrire des bibliothèques d'UDFs compilées (User-Defined Functions) pour le serveur en Free Pascal si vous voulez étendre la liste déjà étendue de fonctions de Firebird).

La base de données ne requiert que peu de travail manuel d'administration une fois configurée, la rendant idéale pour les petite affaires ou l'utilisation en incorporé. Il peut grossir jusqu'à l'échelle du tera-octet avec un réglage approprié, bien que PostgreSQL puisse être un meilleur choix pour de tels environnements.

Firebird offre à la fois des bases de données incorporées (sans serveur autonome) et en client/serveur - utilisable sans avoir à changer une seule ligne de code dans Lazarus/FPC. S'il est utilisé en mode incorporé, il offre un support plus riche de SQL que SQLite ainsi qu'une migration transparente vers une base de données client-serveur, alors que SQLite ne peut être qu'en mode incorporé.

La dernière version stable, Firebird 2.5, tourne sous Windows (32- et 64-bit), diverses versions de Linux (32- et 64-bit), (Sparc et Intel), HP-UX (PA-Risc), OSX et Androïd.

Il n'est pas disponible sur Windows CE/Windows Mobile.

La prise en charge de Firebird dans la bibliothèque SQLdb de FPC est plutôt bonne, comparable au niveau de celle de PostgreSQL.

Documentation

La documentation officielle est incluse dans FPC 2.6.2+ : Documentation SQLDB pour IBConnection.

Installation en client/serveur et en incorporé

Firebird peut fonctionner en mode client/serveur en mode incorporé.

Client/Server veut dire que vous avez un serveur Firebird quelque part : soit sur votre propre machine locale soit sur une autre machine accessible par votre réseau. Les connexions au serveur passent par TCP/IP ; en spécifiant la connexion, le nom d'hôte (hostname) contient un nom ou une adresse IP. La DLL firebird dont vous avez besoin pour ceci est fbclient.dll (avec ses fichiers de support).

Embedded Firebird veurt dire que votre application charge les DLLs Firebird sur une machine locale. En spécifiant la connexion, le nom d'hôte est toujours vide. La DLL Firebird dont vous avez besoin est 'fbembed.dll ( avec ses fichiers de support ).

Voir le wiki sur Firebird incorporé pour plus de détails.

Notez que fbembed.dll peut être utilisé à la fois en utilisation client/serveur et en incorporé, ainsi installer seulement cette DLL peut être une chose maline à faire.

Windows

Win64 : Veuillez lire l'avertissement ici> "Windows Programming Tips/fr") sur l'emploi de certaines versions Win64 de FPC/Lazarus.

Sur Windows : (ceci s'applique à tous les pilotes SQLdb) vous devez avoir la DLL fbclient.dll (ou fbembed.dll) et DLLs de prise en charge installées dans :

Comme avec toutes DLLs (base de données), la bitité (pas de terme pour bitness , largeur du bus d'adressage, 32 ou 64 bit) : utilisez une bibliothèque 32 bit pour un programme compilé en 32 bit et une bibliothèque 64 bit pour un programme compilé en 64 bit.

Unix/Linux/OSX

Sur Linux/OSX/FreeBSD, la bibliothèque client Firebird devrait être installée (p.ex. par votre gestionnaire de paquets ; installer le paquet normal et le paquet -dev), ou elle devrait être placée dans le chemin de recherche des bibliothèques.

FPC recherche les noms de bibliothèque les plus communes (p.ex. libfbclient.so.2.5, libgds.so et libfbembed.so.2.5 ; veuillez vérifier le fichier ibase60.inc si votre version est différente). Si vous le souhaitez, vous pouvez spécifier explicitement le nom de bibliothèque. Il y a deux façons de faire pour cela :

pascal
function InitialiseIBase60(Const LibraryName : AnsiString) : integer;

avec la nom de bibliothèque correct (vous pouvez avoir besoin d'utiliser l'unité ibase60dyn pour cela).

Exemples de connexion

Exemple pour le client/serveur :

pascal
Hostname: 192.168.1.1
    * The database is on the server with IP address 192.168.1.1. 
    DatabaseName: /interdata/example.fdb  
    * The name of the database file is "example.fdb" in the /interdata directory of the server (the machine with IP address 192.168.1.1).
    Username: SYSDBA
    Password: masterkey

Autre exemple pour le client/serveur :

pascal
Hostname: dbhost
    * The database is on the server with the host name dbhost
    DatabaseName: F:\Program Files\firebird\examples\employee.fdb  
    * The name of the database file is "employee.fdb" in the Program Files\firebird\examples directory on the F: drive of dbhost.
    Username: SYSDBA
    Password: masterkey

Un exemple en incorporé :

pascal
Hostname: <empty string>
    * Leaving the hostname empty selects embedded use.
    DatabaseName: test.fdb
    * The database file is "test.fdb" in the directory where the application runs (make sure fbembed.dll is in the application executable directory)
    Username: SYSDBA
    * On embedded, you do have to specify a username...
    Password: <empty string>
    * ... but it doesn't matter what password you give.

Solution à des problèmes client/serveur

Assurez-vous que vosu avez démarré le serveur Interbase/Firebird sur le serveur IP/hostname que vous avez spécifié. Vous pouvez tester la connectivité avec telnet sur la machine. Habituellement, Firebird écoute sur le port 3050 :

pascal
telnet 192.168.1.1 3050

Vous devriez voir quelque chose, peut-être juste un écran blanc, mais vous pouvez tapez quelque chose. Cela signifie que vous pouvez envoyer de la donnée vers la base de données Firebird.
Pour des informations plus détaillées, veuillez consulter la documentation Firebird.

Surveillance des événements

FPC/Lazarus vient avec un composant pour surveiller les événements provenant des bases de données de Firebird. Consultez TFBEventMonitor.

Création d'objets par programmation

Bien que vous puissiez utiliser des outils tels que Flamerobin pour créer des tables, etc., vous pouvez également les créer par programme ou dynamiquement, ce qui pourrait être utile lorsque vous souhaitez que vos programmes mettent à jour les schémas existants de la base de données vers un nouveau schéma.

Vous pouvez utiliser p.exe. TSQLQuery.ExecSQL pour réaliser cette tâche :

pascal
Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))');
    // You need to commit the transaction after DDL before any DML - SELECT, INSERT etc statements.
    // Otherwise the SQL won't see the created objects

Pour faire ceci, utiliser l'objet TSQLScript - voir TSQLScript.

Administration de la base de données

FPC/Lazarus a un composant pour l'administration de base de données ; voir TFBAdmin.

Problèmes courants et résolutions

Parfois, utiliser Firebird à Lazare semble être délicat. Veuillez trouver les solutions ci-dessous.

Tentative de mise à jour de colonne en lecture seule / champs COMPUTED BY

Si vous avez des champs COMPUTED BY (champs calculés du côté du serveur) dans votre table Firebird, SQLdb n'indique pas que ce sont des champs en lecture seule (pour des raisons de performances)

Dans ce cas, les ordres INSERTSQL,UPDATESQL générés automatiquement peuvent amener des messages d'erreur comme "attempted update of read-only column". La solution consiste à spécifier que le champ en question ne peut pas être mis à jour après avoir défini la propriété SQL du TSQLQuery, quelque chose comme :

pascal
// Disable updating this field or searching for changed values as user cannot change it
    sqlquery1.fieldbyname('full_name').ProviderFlags:=[];

Bigint: précision perdue

Si vous utilisez le type de données BIGINT (entier signé 64 bit) dans Firebird, veuillez utilisez .AsLargeInt au lieu de .AsInteger pour les paramètres :

pascal
// Assuming ID is bigint here
    sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
    // Use this:
    sqlquery1.params.parambyname('ID').aslargeint := <some qword or 64 bit integer variable>;
    // Do not use this:
    //sqlquery1.params.parambyname('ID').asinteger := <some qword or 64 bit integer variable>;
    ...

... sinon cous pourriez obtenir des erreurs comme des clés primaires dupliquées - si vous utilisez des BIGINT comme clé primaire.

Types de données Booléens

Les versions de Firebird antérieure à 3.0 ne prennent pas en charge les types de données booléens.

Au moins sur FPC trunk (2.7.1), ce type de données peut être émulé :

Utiliser un domaine qui utilise un type SMALLINT (un autre type d'entier peut convenir - mercide tester et d'ajustyer le texte) :

pascal
CREATE DOMAIN "BOOLEAN"
     AS SMALLINT
     CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
     /* -1 used for compatibility with FPC SQLDB; 1 is used by many other data access layers */
    ;

Utilisez ce type domaine pour votre champ/colonne p.ex.

pascal
CREATE TABLE MYTABLE
    (
    ...
      MYBOOLEANCOLUMN "BOOLEAN",
    );

A faire : vérifier que cela marche avec les grilles de Lazarus.

Problèmes INSERT INTO...RETURNING /Cursor is not open =

Si vous essayez de faire une sélection SQL (p.ex. Query.Open) avec du SQL comme ceci :

pascal
INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID

et obtenez une erreur comme ceci :

pascal
Database error: ??: Fetch??:
     -Dynamic SQL Error
     -SQL error code = -504
     -Invalid cursor reference
     -Cursor is not open(error code: 335544569)

en exécutant FPC 2.6.0 (fourni avec Lazarus 1.0) ou antérieur, alors vous êtes certainement en face d'un bug de l'analyseur FCP SQLdb.

SQLdb pense que l'ordre que vous exécutez est un ordre INSERT normal, lequel ne retourne pas de données. Evidemment, il pourrait retourner de la donnée. Les nouvelles versions ont résolu ce problème.

Si vous utilisez des générateurs/séquences pour vos clés primaires (comme beaucoup le font), une méthode consiste à obtenir d'abord le prochain numéro de la séquence :

pascal
SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* If your generator name is GEN_PEOPLEID */

et vous l'utilisez ensuite dans un INSERT normal. Voir FAQ entry

Locate ne semble pas fonctionner

Source: Issue ##21988 En exécutant Locate sur des champs CHAR UTF8 (ou probablement sur d'autres jeux de caractères multi-octets), Locate peut ne pas trouver votre enregistrement.

Le problème concerne principalement le jeu de caractères UTF8 utilisé et comment Firebird rapporte la longueur de la colonne. Dans le cas de UTF8 Firebird, la longueur de colonne maximale (en octets) est de 4 * "longueur de caractère". Donc, si vous avez une colonne définie comme char (8), Firebird rapporte 4 * 8 = 32. Les valeurs sont cadrées à droite sur cette longueur de 32.

En localisant, vous dites '57200001', il n'y a pas de correspondance car le champ stocke actuellement '57200001 ........................' (les espaces de fin sont représentés pas des points).

Solution de contournement : réécrivez votre requête SELECT:

pascal
SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
pascal
ou
pascal
SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...

ou utilisez des champs VARCHAR.

Remarque : ce problème peut survenir dans d'autres bases de données selon la façon dont elle rapporte la longueur.

Transactions avancées

Sources de ces informations/lectures supplémentaire :

Niveaux d'isolation de transaction

Si vous le voulez, vous pouvez changer les niveaux d'isolation de transaction en ajoutant une ligne dans la propriété Parameters de la transaction :

Exemple:

pascal
SQLTransaction1.Params.text:='isc_tpb_read_committed';

Vous pouvez aussi ajouter des paramètres additionnels qui ont un effet sur la transaction (repris depuis le fichier source ibconnection.pp et 1(http://conferences.embarcadero.com/article/32280)) :

Mode d'accès

Ceci permet de lire seulement ou de lire/écrire :

Résolution de verrous (Lock resolution)

if another transaction is editing the record then wait for it to finish. Peut atténuer les "verrous en direct" en contention intense (2(http://tech.groups.yahoo.com/group/firebird-support/message/58653)). Voir dessous pour le valeurs de timeout.

Réservation de table

Traite les verrous de table entière.

Combinaisons:

Versions d'enregistrement

Ce réglage est en apparence pertinent uniquement pour le mode d'isolation isc_tpb_read_committed pour les enregistrements étant modifiés par d'autres transactions :

Options diverses

Pour être complet, quelques options supplémentaires apparaissant dans le code FPC. Vous utiliserez probablement isc_tpb_no_auto_undo pour accélérer les insertions/mises à jour en différé.

Firebird et les transactions ISO

Les niveaux de transaction de Firebird ne correspondent pas univoquement aux niveaux de transaction ISO/ANSI. Une approximation est :

Combinaisons habituelles

Read committed par défaut (probablement, à contrôler).

Insertion Batch/bulk

isc_tpb_read_committed et isc_tpb_no_rec_version pourrait être une bonne combinaison : il permet à d'autres transactions de fonctionner quand un batch se déroule.

Transaction en lecture seule

Si vous voulez avoir seulement un accès en lecture à la base de données, vous pouvez le faire en réglant les paramètres de transaction :

Cette combinaison ne bloquera pas le ramasse-miette, ce qui est une bonne chose. Source: 4(http://tech.groups.yahoo.com/group/firebird-support/message/118748)

https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png Remarque: La FAQ Firebird indique que vos aurez besoin d'un accès en écriture à la base de données même si vous voulez seulement y lire dedans, à moins que vous ne mettiez le drapeau read-only de base de données (e.g. en utilisant gfix)

Liens et plus d'informations

La liste du dessous montre des liens vers plus d'information sur Firebird et les outils associés.

Echantillons Lazarus Firebird

Outils

Firebird


From the Free Pascal wiki, page "Firebird/fr", as the Internet Archive kept it on 2025-03-15, last changed on 2020-02-16. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Version 3, dernière modification par WikiArchive .