Travailler avec une base de données
Interface IRdbms
L'interface IRdbms n'est qu'un enveloppe léger pour le paquet SQLdb de Free Pascal. Les systèmes RDBMS actuellement pris en charge sont :
- MySQL via la classe TMysqlDb.
- PostgreSQL vers la classe TPostgreSqlDb.
- Firebird via la classe TFirebirdDb.
- SQLite via la classe TSQLiteDb.
- Toutes les bases de données qui prennent en charge ODBC, via la classe TOdbcDb.
Création d'une connexion à la base de données
MySQL
Cela ouvrira la connexion à la base de données vers le serveur MySQL 5.7 sur l'hôte local sur le port 3306.
Remplacez 5.7 par votre version de MySQL, par exemple 5.5 pour vous connecter au serveur de base de données MySQL 5.5. Veuillez noter que la chaîne de caractères MySQL 5.7 est comparée sans distinction de casse. MySQL 5.7 ou mysql 5.7 sont donc identiques.
PostgreSQL
Il ouvrira la connexion à la base de données au serveur PostgreSQL sur l'hôte local sur le port 5432.
Firebird
Il ouvrira la connexion à la base de données au serveur Firebird sur l'hôte local sur le port 3050.
SQLite
Le SQLite est un moteur de base de données léger non client-serveur. Vous pouvez donc laisser l'hôte, le port, le nom d'utilisateur et le mot de passe vides. Le nom de la base de données doit être défini sur le chemin où le fichier de base de données est entreposé.
Cela ouvrira la base de données étant entreposée dans votre your_data.db.
ODBC
Si vous utilisez une base de données n'étant pas encore prise en charge directement par la bibliothèque sqldb de Free Pascal, vous pouvez utiliser une connexion ODBC. La classe TOdbcDb est un enveloppe léger pour la classe TODBCConnection implémentant l'interface IRdbms.
Par exemple, si vous avez /etc/odbcinst.ini avec le contenu suivant :
[my-mariadb-odbc-driver] Description = MariaDB Connector/ODBC v.3.0 Driver = /usr/lib/libmaodbc.so |
et le contenu de /etc/odbc.ini :
[my-app-db] Description=Ma base de données d'applications Driver=my-mariadb-odbc-driver SERVER=localhost PORT=3306 USER=<votre nom d'utilisateur> PASSWORD=<votre mot de passe> DATABASE=<nom de la base de données> |
Pour vous connecter à la base de données à l'aide de my-app-db DSN, définissez le paramètre de base de données avec le nom du DSN comme suit :
Si vous souhaitez modifier la valeur, par exemple pour utiliser un port différent de celui défini dans /etc/odbc.ini, remplissez simplement le paramètre de port avec la valeur souhaitée :
Enregistrement d'une instance IRdbms dans un conteneur de dépendances
Vous pouvez enregistrer une instance IRdbms dans un conteneur de dépendances afin de pouvoir accéder facilement à son instance.
- Var container:IDependencyContainer;
- ...
- container.add(
- 'db',
- TMysqlDbFactory.create(
- 'mysql 5.7',
- 'localhost',
- 'your_db_name',
- 'your_db_username',
- 'yoursecretpassword',
- 3306
- )
- );
Remplacez TMysqlDbFactory par TPostgreSqlDbFactory, TFirebirdSqlDbFactory, TSQLiteDbFactory, TOdbcDbFactory pour PostgreSQL, Firebird, base de données SQLite et ODBC respectivement.
Pour TOdbcDbFactory, en utilisant ODBC avec DSN, vous pouvez vous inscrire simplement en utilisant son nom DSN par exemple :
- container.add(
- 'db',
- TOdbcDbFactory.create()
- .database('my-app-db')
- );
Récupérer l'instance IRdmbs à partir du conteneur de dépendances
Pour obtenir l'instance d'IRdbms, récupérez-la simplement à partir du conteneur de dépendances comme indiqué dans le code suivant :
ou avec une syntaxe de type tableau :
Exécution d'une requête SQL
Contrairement à SQLdb séparant la manière dont vous exécutez les commandes SQL renvoyant un ensemble de résultats et celles ne renvoyant pas d'ensemble de résultats telles que open() pour SELECT et execSQL() pour INSERT ou UPDATE, l'interface IRdbms fait abstraction de cela, vous appelez donc toujours la méthode execute() pour SELECT, INSERT ou UPDATE :
- fRdbms.prepare(
- 'INSERT INTO atable ' +
- '(id, operation, resetTimestamp) VALUES ' +
- '(:idCol, :oprCol, :resetTmp)'
- ).paramStr('idCol', 'abc')
- .paramInt('oprCol', 10)
- .paramInt('resetTmp', 2000)
- .execute();
Passer des paramètres à une requête SQL
Pour éviter l'injection SQL, il est recommandé d'utiliser une instruction préparée avec un paramètre :
- resultSet := db.prepare('SELECT * FROM users WHERE user_email = :userEmail')
- .paramStr('userEmail', 'smaltais@gladir.com')
- .execute();
Pour transmettre des données de type entier, flottant ou date/heure, utilisez respectivement paramInt(), paramFloat() et paramDateTime().
Obtenir le nombre total de lignes dans l'ensemble de résultats
Lire les données à partir de l'ensemble de résultats
Avancer le curseur jusqu'à la position suivante
fields() lira les données à la position actuelle du curseur. Pour lire les données suivantes dans l'ensemble de résultats, il est nécessaire d'appeler next() pour avancer la position du curseur :
- resultSet.next();
Testez si à la fin de l'ensemble de résultats
La méthode fieldByName() génère une exception si vous essayez de lire des données lorsque le curseur est à la fin du fichier. Pour l'éviter, vous devez vérifier la condition de fin de fichier avec eof(). Donc, pour lire toutes les données de l'ensemble de résultats, vous avez besoin de la boucle suivante :
Exécution de la transaction
Ce qui peut mal se passer
Il se peut que certaines choses ne fonctionnent pas en raison d'une bibliothèque manquante, par exemple si vous n'avez pas installé la bibliothèque cliente MySQL ou la bibliothèque cliente ODBC.