Difference between revisions of "Firebird/fr"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(19 intermediate revisions by one other user not shown)
Line 22: Line 22:
  
 
==Installation en client/serveur et en incorporé==
 
==Installation en client/serveur et en incorporé==
Firebird can run in client/server and embedded mode.
+
Firebird peut fonctionner en mode client/serveur en mode incorporé.
  
''Client/Server'' means that you have a physical Firebird server somewhere: either on your local machine or another machine reachable over your network. Connections to the server go through TCP/IP; when specifying the connection, the hostname contains a name or IP address. The Firebird DLL you need for this is ''fbclient.dll'' (''along with its support files'').
+
''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'' means that your application loads the Firebird DLLs to access a Firebird database on the local machine. When specifying the connection, the hostname is always empty. The Firebird DLL you need for this is ''fbembed.dll'' (''along with its support files'').
+
''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'').
See [[Firebird embedded|the wiki page on Firebird embedded]] for more details.
 
  
Note that ''fbembed.dll'' can be used both for client/server and embedded use, so installing only this dll may be a smart thing to do.
+
Voir [[Firebird embedded/fr|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===
 
===Windows===
Win64: please see warning [[Windows Programming Tips#FPC 2.6.x/Lazarus warning|here]] on not using certain FPC/Lazarus Win64 versions.
+
Win64 : Veuillez lire l'avertissement [[Windows Programming Tips/fr#Avertissement sur FPC 2.6.x/Lazarus (support manquant pour SEH)|ici]] sur l'emploi de certaines versions Win64 de FPC/Lazarus.
  
On Windows: (this applies to all SQLDB database drivers) you must have '''fbclient.dll''' (or '''fbembed.dll''') and its support dlls installed in:
+
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 :
* the project directory '''and''' the executable output directory/the application directory (e.g. lib/something under your project directory)
+
* le répertoire du projet '''et''' le répertoire de sortie de l'exécutable/celui de l'application (p.ex. lib/something dans le répertoire de votre projet).
* or a directory in your PATH (not your system directory)
+
* ou un répertoire dans votre PATH (et non pas dans votre répertoire système).
* If you want to use the system directory, please use the official installer and tick "copy fbclient to system directory"
+
* Si vous voulez utilisez le répertoire système, veuillez utiliser l'installateur officiel et cocher "copy fbclient to system directory".
  
As with all (database) DLLs, the bitness of the DLL must match your application: use a 32 bit library for a 32 bit compiled program and a 64 bit library for a 64 bit program.
+
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===
 
===Unix/Linux/OSX===
On Linux/OSX/FreeBSD, the Firebird client library should be installed (e.g. by your package manager; install the regular package and the -dev package), or they should be placed in the library search path.
+
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 searches for the most common library names (e.g. libfbclient.so.2.5, libgds.so, and libfbembed.so.2.5; please check ibase60.inc if your version is different). If you want to, you can explicitly specify the library name. There are 2 ways for this:
+
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 :
* use the [[TSQLDBLibraryLoader]] component from sqldblib (FPC 2.7.1). Works for all SQLDB connector components.
+
* Utiliser le composant [[TSQLDBLibraryLoader/fr|TSQLDBLibraryLoader]] de sqldblib (FPC 2.7.1). Fonctionne pour tous les composants connecteurs de SQLdb.
* call <syntaxhighlight>function InitialiseIBase60(Const LibraryName : AnsiString) : integer;</syntaxhighlight> with the correct library name (you may need to use unit ibase60dyn for this).
+
* Appeler <syntaxhighlight lang=pascal>function InitialiseIBase60(Const LibraryName : AnsiString) : integer;</syntaxhighlight> avec la nom de bibliothèque correct (vous pouvez avoir besoin d'utiliser l'unité ibase60dyn pour cela).
  
 
== Exemples de connexion ==
 
== Exemples de connexion ==
Example for client/server:
+
Exemple pour le client/serveur :
 
  Hostname: 192.168.1.1
 
  Hostname: 192.168.1.1
 
  * The database is on the server with IP address 192.168.1.1.  
 
  * The database is on the server with IP address 192.168.1.1.  
Line 57: Line 58:
 
  Password: masterkey
 
  Password: masterkey
  
Another example for client/server:
+
Autre exemple pour le client/serveur :
 
  Hostname: dbhost
 
  Hostname: dbhost
 
  * The database is on the server with the host name dbhost
 
  * The database is on the server with the host name dbhost
Line 65: Line 66:
 
  Password: masterkey
 
  Password: masterkey
  
An embedded example:
+
Un exemple en incorporé :
 
  Hostname: <empty string>
 
  Hostname: <empty string>
 
  * Leaving the hostname empty selects embedded use.
 
  * Leaving the hostname empty selects embedded use.
Line 76: Line 77:
  
 
== Solution à des problèmes client/serveur ==
 
== Solution à des problèmes client/serveur ==
Make sure you started the Interbase/Firebird server on the server IP/hostname you specified. You can test connectivity by telnetting to the machine. Firebird usually listens on port 3050:
+
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 :
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
telnet 192.168.1.1 3050
 
telnet 192.168.1.1 3050
 
</syntaxhighlight>
 
</syntaxhighlight>
You should see something, maybe just a blank screen, but you can type something. This means you can send data to the Firebird database.
+
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.<br/>
 
+
Pour des informations plus détaillées, veuillez consulter la [https://www.firebirdsql.org/en/documentation/ documentation Firebird].
For further information, please see the Firebird documentation.
 
  
 
== Surveillance des événements ==
 
== Surveillance des événements ==
FPC/Lazarus comes with a component to monitor events coming from Firebird databases; see [[TFBEventMonitor]].
+
FPC/Lazarus vient avec un composant pour surveiller les événements provenant des bases de données de Firebird. Consultez [[TFBEventMonitor/fr|TFBEventMonitor]].
  
 
== Création d'objets par programmation ==
 
== Création d'objets par programmation ==
While you can use tools such as Flamerobin to create tables etc, you can also create these programmatically/dynamically, which could be handy when you want your programs to update existing database schemas to a new schema.
+
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.
  
You can use e.g. TSQLQuery.ExecSQL to perform this task:
+
Vous pouvez utiliser p.exe. TSQLQuery.ExecSQL pour réaliser cette tâche :
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
Query.ExecSQL('CREATE TABLE TEST(ID INTEGER NOT NULL, TESTNAME VARCHAR(800))');
 
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.
 
// You need to commit the transaction after DDL before any DML - SELECT, INSERT etc statements.
Line 97: Line 97:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
To do this, use the TSQLScript object - see [[TSQLScript/fr|TSQLScript]].
+
Pour faire ceci, utiliser l'objet TSQLScript - voir [[TSQLScript/fr|TSQLScript]].
  
 
== Administration de la base de données ==
 
== Administration de la base de données ==
FPC/Lazarus has a component for database adminstration; see [[TFBAdmin/fr|TFBAdmin]]
+
FPC/Lazarus a un composant pour l'administration de base de données ; voir [[TFBAdmin/fr|TFBAdmin]].
  
 
== Problèmes courants et résolutions ==
 
== Problèmes courants et résolutions ==
Sometimes using Firebird in Lazarus seems to be tricky. Please find solutions below.
+
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 ===
 
=== Tentative de mise à jour de colonne en lecture seule / champs COMPUTED BY ===
If you have COMPUTED BY fields (server-side calculated fields) in your Firebird table, SQLDB will not pick up that these are read only fields (for performance reasons).
+
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)  
  
In this case, auto-generated INSERTSQL,UPDATESQL statements can lead to error messages like "attempted update of read-only column".
+
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".
The solution is to manually specify that the field in question may not be updated after setting the TSQLQuery's SQL property, something like:
+
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 :
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
// Disable updating this field or searching for changed values as user cannot change it
 
// Disable updating this field or searching for changed values as user cannot change it
 
sqlquery1.fieldbyname('full_name').ProviderFlags:=[];
 
sqlquery1.fieldbyname('full_name').ProviderFlags:=[];
Line 116: Line 116:
  
 
=== Bigint: précision perdue ===
 
=== Bigint: précision perdue ===
If you use the bigint datatype (64 bit signed integer) in Firebird, please use .AsLargeInt instead of .AsInteger for parameters:
+
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 :
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
// Assuming ID is bigint here
 
// Assuming ID is bigint here
 
sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
 
sqlquery1.sql.text := 'insert into ADDRESS (ID) values (:ID)';
Line 126: Line 126:
 
...
 
...
 
</syntaxhighlight>
 
</syntaxhighlight>
... otherwise you might get errors like duplicate PK (primary key) - if using the bigint as a primary key.
+
... 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 ===
 
=== Types de données Booléens ===
Firebird versions below 3.0 do not support boolean data types.
+
Les versions de Firebird antérieure à 3.0 ne prennent pas en charge les types de données booléens.
  
At least on FPC trunk (2.7.1) this datatype can be emulated:
+
Au moins sur FPC trunk (2.7.1), ce type de données peut être émulé :
  
Use a DOMAIN that uses a SMALLINT type (other integer types may work as well - please test and adjust text): <syntaxhighlight lang="SQL">CREATE DOMAIN "BOOLEAN"
+
Utiliser un domaine qui utilise un type SMALLINT (un autre type d'entier peut convenir - mercide tester et d'ajustyer le texte) :
 +
<syntaxhighlight lang="SQL">CREATE DOMAIN "BOOLEAN"
 
  AS SMALLINT
 
  AS SMALLINT
 
  CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
 
  CHECK (VALUE IS NULL OR VALUE IN (-1,0,1))
Line 140: Line 141:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
+
Utilisez ce type domaine pour votre champ/colonne p.ex.
Let your field/column use this domain type e.g. <syntaxhighlight lang="SQL">
+
<syntaxhighlight lang="SQL">
 
CREATE TABLE MYTABLE
 
CREATE TABLE MYTABLE
 
(
 
(
Line 148: Line 149:
 
);
 
);
 
</syntaxhighlight>
 
</syntaxhighlight>
* Now you can use .AsBoolean for assigning field values etc
+
* Maintenant vous pouvez utiliser .AsBoolean pour l'affectation des valeurs du champ etc.
  
'''To do: verify this works with Lazarus grids etc as well.'''
+
'''A faire : vérifier que cela marche avec les grilles de Lazarus.'''
  
 
=== Problèmes INSERT INTO...RETURNING /Cursor is not open ====
 
=== Problèmes INSERT INTO...RETURNING /Cursor is not open ====
If you try to select SQL (e.g. Query.Open) with SQL like this:
+
Si vous essayez de faire une sélection SQL (p.ex. Query.Open) avec du SQL comme ceci :
 
<syntaxhighlight lang="SQL">
 
<syntaxhighlight lang="SQL">
 
INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID
 
INSERT INTO PEOPLE (NICKNAME) VALUES ('Superman') RETURNING ID
 
</syntaxhighlight>
 
</syntaxhighlight>
and get something like this error:
+
et obtenez une erreur comme ceci :
 
<syntaxhighlight lang="dos">
 
<syntaxhighlight lang="dos">
 
Database error:  : Fetch :
 
Database error:  : Fetch :
Line 165: Line 166:
 
  -Cursor is not open(error code: 335544569)
 
  -Cursor is not open(error code: 335544569)
 
</syntaxhighlight>
 
</syntaxhighlight>
while running FPC 2.6.0 (which is supplied with Lazarus 1.0) or lower, then you probably ran into an FPC SQLDB parser bug.
+
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 thinks the statement you're running is a normal INSERT statement, which doesn't return data. Obviously, it should return data.
+
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.
Newer FPC code has fixes for this.
+
Les nouvelles versions ont résolu ce problème.
  
If you're using generators/sequences for your primary keys (like many do), a workaround is to first get the next sequence number:
+
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 :
 
<syntaxhighlight lang="SQL">
 
<syntaxhighlight lang="SQL">
 
SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* If your generator name is GEN_PEOPLEID */  
 
SELECT NEXT VALUE FOR GEN_PEOPLEID FROM RDB$DATABASE /* If your generator name is GEN_PEOPLEID */  
 
</syntaxhighlight>
 
</syntaxhighlight>
then use that to do a regular INSERT.
+
et vous l'utilisez ensuite dans un INSERT normal.
see [http://www.firebirdfaq.org/faq111/|Firebird FAQ entry]
+
Voir [http://www.firebirdfaq.org/faq111/|Firebird FAQ entry]
  
 
=== Locate ne semble pas fonctionner ===
 
=== Locate ne semble pas fonctionner ===
 
Source: {{MantisLink|#21988}}
 
Source: {{MantisLink|#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.
  
When running locate on UTF8 (or presumably other multibyte character sets) CHAR fields, locate may not find your record.
+
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.
  
The problem is related mostly to UTF8 charset used and how Firebird reports column length. In case of UTF8 Firebird reports the maximum column length (in bytes) as 4*"character length". So if you have a column defined as char(8), Firebird reports 4*8=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).
  
Values are right-padded to this length 32.
+
Solution de contournement : réécrivez votre requête SELECT:
When locating say '57200001' there is no match because the field actually stores '57200001 ........................' (with trailing spaces represented by dots here).
+
<syntaxhighlight lang=pascal>
 
 
Workaround: rewrite your select query:
 
<syntaxhighlight>
 
 
SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
 
SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
 
</syntaxhighlight>
 
</syntaxhighlight>
  or
+
  ou
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...
 
SELECT cast(THEFIELD as varchar(8)) as THEFIELD ...
 
</syntaxhighlight>
 
</syntaxhighlight>
or use VARCHAR fields.
+
ou utilisez des champs VARCHAR.
  
Note: this problem may occur for other databases as well depending on their reporting of field length.
+
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 ==
 
== Transactions avancées ==
Sources for this information/further reading:  
+
Sources de ces informations/lectures supplémentaire :
* [http://www.ibphoenix.com/resources/documents/how_to/doc_400 Understanding Firebird Transactions] very detailed article
+
* [http://www.ibphoenix.com/resources/documents/how_to/doc_400 Comprendre les transactions de firebird] article très détaillé.
* Interbase 6 API Guide (valid for Firebird+Interbase), page 63 and further
+
* Guide des API d'Interbase 6 (valable pour Firebird+Interbase), page 63 (en version anglaise) et suivantes.
* [http://conferences.embarcadero.com/article/32280 Overview of transaction settings in Interbase]
+
* [http://conferences.embarcadero.com/article/32280 Vue d'ensemble des réglages de transaction en Interbase]
* [http://tech.groups.yahoo.com/group/firebird-support/message/58653 Detailed explanation of parameters in Firebird]
+
* [http://tech.groups.yahoo.com/group/firebird-support/message/58653 Explication détaillée des paramètres dans Firebird]
* [http://fhasovic.blogspot.com/2005/02/transaction-isolation-levels-in.html Overview of settings in Firebird]
+
* [http://fhasovic.blogspot.com/2005/02/transaction-isolation-levels-in.html Vue d'ensemble des réglages dans Firebird]
* [http://www.devrace.com/en/fibplus/articles/3292.php Transaction isolation levels in FIBPlus]
+
* [http://www.devrace.com/en/fibplus/articles/3292.php Niveaux d'isolation dans FIBPlus]
* README.set_transaction.txt in Firebird 2.5 documentation folder.
+
* README.set_transaction.txt dans le répertoire de documentation de Firebird 2.5.
  
 
=== Niveaux d'isolation de transaction ===
 
=== Niveaux d'isolation de transaction ===
If you want to, you can change the transaction isolation levels by adding a line in the transaction's Parameters property:
+
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 :
* <code>isc_tpb_read_committed</code>: you see all changes committed by other transactions
+
* <code>isc_tpb_read_committed</code> : vous voyez tous les changements commis (''committed'') par les autres transactions.
* <code>isc_tpb_concurrency</code>: also called Snapshot: you see database as it was when the transaction started. Has more overhead than isc_tpb_read_committed. Better than ANSI Serializable because it has no phantom reads.
+
* <code>isc_tpb_concurrency</code> aussi appelé Snapshot : vous voyez la base de données telle qu'elle était quand la transaction a commencé. Plus coûteux (''Has more overhead'') que isc_tpb_read_committed. Mieux que Sérialisable ANSI car il n'y pas de lecture fantôme.
* <code>isc_tpb_consistency</code>: also called Table Stability: stable, serializable view of data, but locks tables. Unlikely you will need this
+
* <code>isc_tpb_consistency</code> aussi appelé Stabilité de Table : vue des données stable, sérialisable, mais verrouille les tables. Il est peu probable que vous ayez besoin de cela.
  
 
Exemple:
 
Exemple:
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
SQLTransaction1.Params.text:='isc_tpb_read_committed';
 
SQLTransaction1.Params.text:='isc_tpb_read_committed';
 
</syntaxhighlight>
 
</syntaxhighlight>
  
You can also add additional parameters that have an effect on the transaction (taken from the ibconnection.pp source file and [http://conferences.embarcadero.com/article/32280]):
+
Vous pouvez aussi ajouter des paramètres additionnels qui ont un effet sur la transaction (repris depuis le fichier source ibconnection.pp et [http://conferences.embarcadero.com/article/32280]) :
  
 
=== Mode d'accès ===
 
=== Mode d'accès ===
This allow reads only or read/write
+
Ceci permet de lire seulement ou de lire/écrire :
* <code>isc_tpb_read</code>: read permission
+
* <code>isc_tpb_read</code>: permission en lecture
* <code>isc_tpb_write</code>: read+write permission
+
* <code>isc_tpb_write</code>: permission en lecture+écriture
  
 
=== Résolution de verrous (''Lock resolution'') ===
 
=== Résolution de verrous (''Lock resolution'') ===
* <code>isc_tpb_nowait</code>: if another transaction is editing the record then don't wait
+
* <code>isc_tpb_nowait</code> : si une autre transaction édite l'enregistrement alors ne pas attendre.
* <code>isc_tpb_wait</code>: if another transaction is editing the record then wait for it to finish. Can mitigate "live locks" in heavy contention ([http://tech.groups.yahoo.com/group/firebird-support/message/58653]). See below for timeout value.
+
* <code>isc_tpb_wait</code> : si une autre transaction édite l'enregistrement alors attendre pour finir.
 +
if another transaction is editing the record then wait for it to finish. Peut atténuer les "verrous en direct" en contention intense ([http://tech.groups.yahoo.com/group/firebird-support/message/58653]). Voir dessous pour le valeurs de timeout.
  
 
=== Réservation de table ===
 
=== Réservation de table ===
Deals with locking entire tables.
+
Traite les verrous de table entière.
* <code>isc_tpb_shared</code>: first specify this, then either lock_read or lock_write for one or more tables. Shared read or write mode for tables.
+
* <code>isc_tpb_shared</code> : spécifiez d'abord ceci, ensuite soit lock_read ou lock_write pour une ou plusieurs tables. Mode de lecture ou écriture partagée pour des tables.
* <code>isc_tpb_protected</code>: first specify this, then either lock_read or lock_write for one or more tables. Lock on tables; can allow deadlock-free operation at the cost of delayed transactions
+
* <code>isc_tpb_protected</code> : Spécifiez d'abord cela puis soit lock_read ou lock_write pour une ou plusieurs tables. Verrouille des tables ; peut permettre un fonctionnement sans blocage (''deadlock-free'') au coût de transactions différées.
* <code>isc_tpb_lock_read</code>: Set a read lock. Specify which table to lock, e.g. isc_tpb_lock_read=CUSTOMERS
+
* <code>isc_tpb_lock_read</code> : Définit un verrou en lecture. Spécifier la table à verrouiller, p.ex. isc_tpb_lock_read=CUSTOMERS.
* <code>isc_tpb_lock_write</code>: Set a read/write lock. Specify which table to lock, e.g. isc_tpb_lock_read=CUSTOMERS
+
* <code>isc_tpb_lock_write</code> : Définit un verrou en lecture/écriture. Spécifier quelle table est à verrouiller, p.ex. isc_tpb_lock_read=CUSTOMERS.
Combinations:
+
Combinaisons:
* Shared, lock_write: write transactions with concurrency or read committed isolation
+
* Shared, lock_write : transactions en écriture avec concurrency ou en isolation read committed, qui peuvent mettre à jour la table. Toutes les transactions peuvent lire la table.
can update the table. All transactions can read the table
+
* Shared, lock_read : toute transaction peut lire ou écrire.
* Shared, lock_read: any transaction can read or update
+
* Protected, lock_write : Les autres transactions ne peuvent pas mettre à jour la table. Seules les transactions en concurrency et en read committed peuvent lire la table.
* Protected, lock_write: Other transactions cannot update the table. Only concurrency and
+
* Protected, lock_read : Les autres transactions ne peuvent pas mettre à jour la table. Toute transaction peut lire la table.
read committed transactions can read the table
 
* Protected, lock_read: Other transactions cannot update the table. Any transaction can
 
read the table
 
  
 
=== Versions d'enregistrement ===
 
=== Versions d'enregistrement ===
This setting is apparently only relevant for isc_tpb_read_committed isolation mode for records being modified by other transactions:
+
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 :
* <code>isc_tpb_no_rec_version</code>: only newest record version is read. Can be useful for batch/bulk insert operations together with isc_tpb_read_committed)
+
* <code>isc_tpb_no_rec_version</code> : Seul l'enregistrement le plus récent est lu. Peut être utile pour les opération d'insertion en batch/bulk avec isc_tpb_read_committed.
* <code>isc_tpb_rec_version</code>: the latest committed version is read, even when the other transaction has other uncommitted changes '''note: verify this'''. More overhead than isc_tpb_no_rec_version
+
* <code>isc_tpb_rec_version</code> : La dernière version validée (''committed'') est lue, même lorsque l'autre transaction a d'autres modifications non validées '''note: vérifiez ceci'''. Plus de charge que isc_tpb_no_rec_version.
  
 
=== Options diverses ===
 
=== Options diverses ===
For completeness, some more options appearing in the Firebird/Interbase FPC code.
+
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é.
You will likely only ever use isc_tpb_no_auto_undo to speed up batch inserts/edits.
+
* isc_tpb_exclusive (apparemment traduit par protected en Firebird, voir [http://tech.groups.yahoo.com/group/firebird-support/message/58653])
* isc_tpb_exclusive (apparently translates to protected in Firebird, see [http://tech.groups.yahoo.com/group/firebird-support/message/58653])
+
* isc_tpb_verb_time (relatif aux contraintes différées, qui pourraient s'exécuter au temps du verbe (''verb time'') ou lors du commit. Firebird : non implémenté, utilise toujours le temps du verbe.
* isc_tpb_verb_time (Related to deferred constraints, which could execute at verb time or commit time. Firebird: not implemented, always use verb time)
+
* isc_tpb_commit_time (relatif aux contraintes différées, qui pourraient s'exécuter au temps du verbe (''verb time'') ou lors du commit. Firebird : non implémenté, utilise toujours le temps du verbe.
* isc_tpb_commit_time (Related to deferred constraints, which could execute at verb time or commit time. Firebird: not implemented, always use verb time)
+
* isc_tpb_ignore_limbo (ignore les enregistrements créés par des transactions dans les limbes (''limbo''). Les transactions dans les limbes sont des validations (''commit'')  à deux phases qui échouent dans des transactions multi-bases. Il est peut probable que vous ayez besoin de cette fonctionnalité).
* isc_tpb_ignore_limbo (ignores the records created by transactions in limbo. Limbo transactions are failing two-phase commits in multi-database transactions. Unlikely that you will need this feature)
+
* isc_tpb_autocommit (valide automatiquement cette transaction : chaque ordre est une transaction séparée. Sans doute spécifiquement prévu pour le pilote JDBC JayBrid).
* isc_tpb_autocommit (autocommit this transaction: every statement is a separate transaction. Probably specifically for JayBird JDBC driver.)
+
* isc_tpb_restart_requests (apparemment recherche les requêtes dans la connexion qui ont été actives dans une autre transaction, les débobinent (''unwinds''), et les recommencent dans une nouvelle transaction).
* isc_tpb_restart_requests (apparently looks for requests in the connection which had been active in another transaction, unwinds them, and restarts them under the new transaction.)
+
* isc_tpb_no_auto_undo (désactive le journal de défaire (''undo'') au niveau de la transaction, pratique pour obtenir le débit maximal en réalisant une mise à jour différée (''batch''). Aucun effet en lecture de donnée).
* isc_tpb_no_auto_undo (disable transaction-level undo log, handy for getting max throughput when performing a batch update. Has no effect when only reading data.)
+
* isc_tpb_lock_timeout (spécifiez le nombre de secondes d'attente de la libération du verrou. Si vous utilisez isc_tpb_wait. Si cette valeur est atteinte sans libération du verrou, une erreur est rapportée).
* isc_tpb_lock_timeout (specify number of seconds to wait for lock release, if you use isc_tpb_wait. If this value is reached without lock release, an error is reported.)
 
  
 
=== Firebird et les transactions ISO ===
 
=== Firebird et les transactions ISO ===
Firebird transaction do not map 1 to 1 to ISO/ANSI transaction levels. An approximation is:
+
Les niveaux de transaction de Firebird ne correspondent pas univoquement aux niveaux de transaction ISO/ANSI. Une approximation est :
 
* ISO Read Committed=READ COMMITTED+RECORD_VERSION
 
* ISO Read Committed=READ COMMITTED+RECORD_VERSION
 
* ISO Read Committed=READ COMMITTED+NO RECORD_VERSION
 
* ISO Read Committed=READ COMMITTED+NO RECORD_VERSION
* ISO Repeatable Read=SNAPSHOT (also known as CONCURRENCY)
+
* ISO Repeatable Read=SNAPSHOT (aussi connu comme CONCURRENCY)
* ISO Serializable=SNAPSHOT TABLE STABILITY (also known as CONSISTENCY)
+
* ISO Serializable=SNAPSHOT TABLE STABILITY (aussi connu comme CONSISTENCY)
  
 
=== Combinaisons habituelles ===
 
=== Combinaisons habituelles ===
Default is (probably, will have to check) read committed.
+
Read committed par défaut (probablement, à contrôler).
  
 
==== Insertion Batch/bulk ====
 
==== Insertion Batch/bulk ====
isc_tpb_read_committed and isc_tpb_no_rec_version could be a good combination: it allows other transactions to function while the batch is going on.
+
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 ====
 
==== Transaction en lecture seule ====
If you want to only have read access to the database, you can do so by setting these transaction parameters:
+
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 :
 
* <code>isc_tpb_read</code>
 
* <code>isc_tpb_read</code>
 
* <code>isc_tpb_read_committed</code>
 
* <code>isc_tpb_read_committed</code>
 
* <code>isc_tpb_rec_version</code>
 
* <code>isc_tpb_rec_version</code>
 
* <code>nowait</code>
 
* <code>nowait</code>
This combination will not block garbage collection, which is a good thing.
+
Cette combinaison ne bloquera pas le ramasse-miette, ce qui est une bonne chose.
 
Source: [http://tech.groups.yahoo.com/group/firebird-support/message/118748]
 
Source: [http://tech.groups.yahoo.com/group/firebird-support/message/118748]
  
Note: the [http://www.firebirdfaq.org/faq164/ Firebird FAQ] indicates you will need write access to the database file even if you only read from it, unless you set the database read-only flag (e.g. using gfix).
+
{{Note|La [http://www.firebirdfaq.org/faq164/ 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 ==
 
== Liens et plus d'informations ==
 
+
La liste du dessous montre des liens vers plus d'information sur Firebird et les outils associés.
The list below shows links to more information on Firebird and related tools.
+
* [[Firebird_embedded|Utilisation de Firebird incorporé avec FPC/Lazarus]]
* [[Firebird_embedded|Using Firebird embedded with FPC/Lazarus]]
 
  
 
=== Echantillons Lazarus Firebird ===
 
=== Echantillons Lazarus Firebird ===
* Sample Lazarus/Firebird application source code [http://lazarus.freepascal.org/index.php/topic,13940.msg73617.html#msg73617]
+
* Code source pour une application exemple Lazarus/Firebird [http://lazarus.freepascal.org/index.php/topic,13940.msg73617.html#msg73617]
* Firebird/SQLDB tutorials:  
+
* Tutoriels Firebird/SQLDB :  
 
** [[SQLdb Tutorial0/fr|SQLdb Tutoriel 0]]
 
** [[SQLdb Tutorial0/fr|SQLdb Tutoriel 0]]
 
** [[SQLdb Tutorial0/fr|SQLdb Tutoriel 1]]
 
** [[SQLdb Tutorial0/fr|SQLdb Tutoriel 1]]
Line 301: Line 297:
 
** [[SQLdb Tutorial0/fr|SQLdb Tutoriel 4]]
 
** [[SQLdb Tutorial0/fr|SQLdb Tutoriel 4]]
  
*PP4S tutorials; cover Firebird installation on Windows as well:
+
* Tutoriels PP4S ; couvre aussi bien l'installation de Firebird sous Windows :
** [http://www.pp4s.co.uk/main/tu-db-plan.html Planning a Database]
+
** [http://www.pp4s.co.uk/main/tu-db-plan.html Planification d'une base de données]
** [http://www.pp4s.co.uk/main/tu-db-installingfirebird01.html Installing Firebird]
+
** [http://www.pp4s.co.uk/main/tu-db-installingfirebird01.html Installation de Firebird]
** [http://www.pp4s.co.uk/main/tu-db-firebird-create.html Creating a Firebird database]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-create.html Création d'une base de données Firebird]
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo1.html Editing a Firebird database]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo1.html Edition d'une base de données Firebird]
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo2.html Searching a Firebird database]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo2.html Recherche dans une base de données Firebird]
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo3.html Creating and printing a report]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo3.html Création et impression d'un rapport]
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo4.html Creating and using stored procedures]
+
** [http://www.pp4s.co.uk/main/tu-db-firebird-demo4.html Création et utilisation de procédures stockées]
  
 
=== Outils ===
 
=== Outils ===
* FlameRobin [http://www.flamerobin.org/ Flamerobin site] Open source GUI tool to manage Firebird, available for Linux, Windows and Mac OSX. Highly recommended.
+
* FlameRobin [http://www.flamerobin.org/ Flamerobin site] Outil avec IHM en Open Source pour gérer Firebird, disponible pour Linux, Windows et Mac OSX. Hautement recommandé.
* Turbobird [https://github.com/motaz/turbobird Turbobird site] Open source GUI tool to manage Firebird. Written with Lazarus using TIBConnection
+
* Turbobird [https://github.com/motaz/turbobird Site Turbobird] Outil avec IHM en Open Source pour gérer Firebird. Ecrit avec Lazarus et utilisant TIBConnection.
* ibconsole : Tool to manage Firebird an Interbase Databases with a GUI, available for Windows and Linux
+
* ibconsole : Outil pour gérer des bases de données Firebird et Interbase avec une IHM, disponible pour Windows et Linux.
* Lazarus Data Desktop - included in the Lazarus repository (found in the 'tools/lazdatadesktop/' directory)
+
* Lazarus Data Desktop - inclus dans le référentiel de Lazarus (trouvé dans le répertoire 'tools/lazdatadesktop/').
* [http://lazsqlx.wordpress.com/ LazSQLX] Multi-database open source database management tool. Written with Lazarus using both SQLDB and Zeos components. Includes support for Firebird.  
+
* [http://lazsqlx.wordpress.com/ LazSQLX] Outil de gestion Multi base de données en Open Source. Ecrit avec Lazarus en utilisant à la fois les composants SQLDB et Zeos. Inclut la prise en charge de Firebird.  
* tiSQLEditor - included in the "Support Apps" directory of the [[tiOPF]] repository. It is a tool used to write SQL with some code completion support, can run scripts, execute upgrade scripts for applications from one build to a later build, has various handy copy and paste functions for Object Pascal applications, has many features that are useful to tiOPF (creates Object Pascal code templates from query results, for tiOPF's visitor classes), export query results to CSV etc.
+
* tiSQLEditor - Inclus dans le répertoire "Support Apps" du référentiel [[tiOPF/fr|tiOPF]]. C'est un outil utilisé pour écrire du SQL avec un petite prise en charge de la complétion de code, peut exécuter des scripts, exécuter des scripts pour des applications d'une version à une autre plus récente, a des fonctions pratique de copier/coller pour les applications en Pascal Objet, a de nombreuses fonctions utiles pour tiOPF (crée des patrons de code Pascal Objet depuis les résultats de requêtes, pour les classes visiteurs de tiOPF), exporte les résultats de requête vers le CSV etc.
  
 
=== Firebird ===
 
=== Firebird ===
 
* Le SGBDR Firebird [http://firebirdsql.org/ site de Firebird]. Ce site contient aussi beaucoup de documentation sur Firebird.
 
* Le SGBDR Firebird [http://firebirdsql.org/ site de Firebird]. Ce site contient aussi beaucoup de documentation sur Firebird.
 
* FAQ Firebird [http://firebirdfaq.org/]. Site pratique qui montre p.ex. les différences avec les autres SGBDR.
 
* FAQ Firebird [http://firebirdfaq.org/]. Site pratique qui montre p.ex. les différences avec les autres SGBDR.
<br/>
 

Latest revision as of 01:15, 16 February 2020

English (en) français (fr) русский (ru)

Portail de la base de données

Références:

Tutoriels/articles pratiques :

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 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 :

  • le répertoire du projet et le répertoire de sortie de l'exécutable/celui de l'application (p.ex. lib/something dans le répertoire de votre projet).
  • ou un répertoire dans votre PATH (et non pas dans votre répertoire système).
  • Si vous voulez utilisez le répertoire système, veuillez utiliser l'installateur officiel et cocher "copy fbclient to system directory".

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 :

  • Utiliser le composant TSQLDBLibraryLoader de sqldblib (FPC 2.7.1). Fonctionne pour tous les composants connecteurs de SQLdb.
  • Appeler
    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 :

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 :

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é :

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 :

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 :

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 :

// 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 :

// 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) :

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.

CREATE TABLE MYTABLE
(
...
  MYBOOLEANCOLUMN "BOOLEAN",
);
  • Maintenant vous pouvez utiliser .AsBoolean pour l'affectation des valeurs du champ etc.

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 :

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

et obtenez une erreur comme ceci :

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 :

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:

SELECT substring(THEFIELD from 1 for 8) AS THEFIELD ...
ou
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 :

  • isc_tpb_read_committed : vous voyez tous les changements commis (committed) par les autres transactions.
  • isc_tpb_concurrency aussi appelé Snapshot : vous voyez la base de données telle qu'elle était quand la transaction a commencé. Plus coûteux (Has more overhead) que isc_tpb_read_committed. Mieux que Sérialisable ANSI car il n'y pas de lecture fantôme.
  • isc_tpb_consistency aussi appelé Stabilité de Table : vue des données stable, sérialisable, mais verrouille les tables. Il est peu probable que vous ayez besoin de cela.

Exemple:

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]) :

Mode d'accès

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

  • isc_tpb_read: permission en lecture
  • isc_tpb_write: permission en lecture+écriture

Résolution de verrous (Lock resolution)

  • isc_tpb_nowait : si une autre transaction édite l'enregistrement alors ne pas attendre.
  • isc_tpb_wait : si une autre transaction édite l'enregistrement alors attendre pour finir.

if another transaction is editing the record then wait for it to finish. Peut atténuer les "verrous en direct" en contention intense ([2]). Voir dessous pour le valeurs de timeout.

Réservation de table

Traite les verrous de table entière.

  • isc_tpb_shared : spécifiez d'abord ceci, ensuite soit lock_read ou lock_write pour une ou plusieurs tables. Mode de lecture ou écriture partagée pour des tables.
  • isc_tpb_protected : Spécifiez d'abord cela puis soit lock_read ou lock_write pour une ou plusieurs tables. Verrouille des tables ; peut permettre un fonctionnement sans blocage (deadlock-free) au coût de transactions différées.
  • isc_tpb_lock_read : Définit un verrou en lecture. Spécifier la table à verrouiller, p.ex. isc_tpb_lock_read=CUSTOMERS.
  • isc_tpb_lock_write : Définit un verrou en lecture/écriture. Spécifier quelle table est à verrouiller, p.ex. isc_tpb_lock_read=CUSTOMERS.

Combinaisons:

  • Shared, lock_write : transactions en écriture avec concurrency ou en isolation read committed, qui peuvent mettre à jour la table. Toutes les transactions peuvent lire la table.
  • Shared, lock_read : toute transaction peut lire ou écrire.
  • Protected, lock_write : Les autres transactions ne peuvent pas mettre à jour la table. Seules les transactions en concurrency et en read committed peuvent lire la table.
  • Protected, lock_read : Les autres transactions ne peuvent pas mettre à jour la table. Toute transaction peut lire la table.

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 :

  • isc_tpb_no_rec_version : Seul l'enregistrement le plus récent est lu. Peut être utile pour les opération d'insertion en batch/bulk avec isc_tpb_read_committed.
  • isc_tpb_rec_version : La dernière version validée (committed) est lue, même lorsque l'autre transaction a d'autres modifications non validées note: vérifiez ceci. Plus de charge que isc_tpb_no_rec_version.

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

  • isc_tpb_exclusive (apparemment traduit par protected en Firebird, voir [3])
  • isc_tpb_verb_time (relatif aux contraintes différées, qui pourraient s'exécuter au temps du verbe (verb time) ou lors du commit. Firebird : non implémenté, utilise toujours le temps du verbe.
  • isc_tpb_commit_time (relatif aux contraintes différées, qui pourraient s'exécuter au temps du verbe (verb time) ou lors du commit. Firebird : non implémenté, utilise toujours le temps du verbe.
  • isc_tpb_ignore_limbo (ignore les enregistrements créés par des transactions dans les limbes (limbo). Les transactions dans les limbes sont des validations (commit) à deux phases qui échouent dans des transactions multi-bases. Il est peut probable que vous ayez besoin de cette fonctionnalité).
  • isc_tpb_autocommit (valide automatiquement cette transaction : chaque ordre est une transaction séparée. Sans doute spécifiquement prévu pour le pilote JDBC JayBrid).
  • isc_tpb_restart_requests (apparemment recherche les requêtes dans la connexion qui ont été actives dans une autre transaction, les débobinent (unwinds), et les recommencent dans une nouvelle transaction).
  • isc_tpb_no_auto_undo (désactive le journal de défaire (undo) au niveau de la transaction, pratique pour obtenir le débit maximal en réalisant une mise à jour différée (batch). Aucun effet en lecture de donnée).
  • isc_tpb_lock_timeout (spécifiez le nombre de secondes d'attente de la libération du verrou. Si vous utilisez isc_tpb_wait. Si cette valeur est atteinte sans libération du verrou, une erreur est rapportée).

Firebird et les transactions ISO

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

  • ISO Read Committed=READ COMMITTED+RECORD_VERSION
  • ISO Read Committed=READ COMMITTED+NO RECORD_VERSION
  • ISO Repeatable Read=SNAPSHOT (aussi connu comme CONCURRENCY)
  • ISO Serializable=SNAPSHOT TABLE STABILITY (aussi connu comme CONSISTENCY)

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 :

  • isc_tpb_read
  • isc_tpb_read_committed
  • isc_tpb_rec_version
  • nowait

Cette combinaison ne bloquera pas le ramasse-miette, ce qui est une bonne chose. Source: [4]

Light bulb  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

  • FlameRobin Flamerobin site Outil avec IHM en Open Source pour gérer Firebird, disponible pour Linux, Windows et Mac OSX. Hautement recommandé.
  • Turbobird Site Turbobird Outil avec IHM en Open Source pour gérer Firebird. Ecrit avec Lazarus et utilisant TIBConnection.
  • ibconsole : Outil pour gérer des bases de données Firebird et Interbase avec une IHM, disponible pour Windows et Linux.
  • Lazarus Data Desktop - inclus dans le référentiel de Lazarus (trouvé dans le répertoire 'tools/lazdatadesktop/').
  • LazSQLX Outil de gestion Multi base de données en Open Source. Ecrit avec Lazarus en utilisant à la fois les composants SQLDB et Zeos. Inclut la prise en charge de Firebird.
  • tiSQLEditor - Inclus dans le répertoire "Support Apps" du référentiel tiOPF. C'est un outil utilisé pour écrire du SQL avec un petite prise en charge de la complétion de code, peut exécuter des scripts, exécuter des scripts pour des applications d'une version à une autre plus récente, a des fonctions pratique de copier/coller pour les applications en Pascal Objet, a de nombreuses fonctions utiles pour tiOPF (crée des patrons de code Pascal Objet depuis les résultats de requêtes, pour les classes visiteurs de tiOPF), exporte les résultats de requête vers le CSV etc.

Firebird

  • Le SGBDR Firebird site de Firebird. Ce site contient aussi beaucoup de documentation sur Firebird.
  • FAQ Firebird [6]. Site pratique qui montre p.ex. les différences avec les autres SGBDR.