Accéder à une base de données MariaDB ou MySQL avec FireDAC

Au moment où j'écris ces lignes, Delphi et C++Builder proposent deux environnements de développement : la version historique en 32 bits et une version en 64 bits proposée depuis 2025.

De leur côté, les bases de données client-serveur MariaDB et MySQL ne fournissent plus qu'une version 64 bits de leur moteur et des logiciels clients pour y accéder.

Si vous utilisez l'IDE 64 bits pour produire des applications console, serveur, VCL ou FireMonkey en 64 bits pour Windows (x64 ou ARM), pas de problème : installez un serveur local ou un paquet contenant les DLL clientes. Vous pourrez accéder à une base de données de développement depuis l'IDE et pourrez modifier par code vos connexions pour accéder aux vraies bases de données.

Si vous utilisez l'IDE en 32 bits, ça coince : il vous faudra une DLL 32 bits qui fournira un accès à MySQL ou MariaDB.

La dernière version 32 bits de MySQL est la version 5.7.44 que l'on peut toujours télécharger depuis leur site. De son côté MariaDB ne propose plus le téléchargement de versions 32 bits donc impossible d'avoir cette version de la DLL cliente, vous devez passer par celle de MySQL.

Si vous n'avez pas le courage, la place ou la possibilité d'installer une vieille version juste pour récupérer les DLL, vous pouvez toujours récupérer la version 32 et 64 bits des DLL clientes de MySQL en version 5.1.73 sur mon compte Dropbox (copiez les chez vous, ce lien ne fonctionnera pas pendant des décennies). Elles sont compatibles avec MariaDB.

Dans le concepteur de fiches de votre projet il vous suffit de placer un composant TFDPhysMySQLDriverLink où vous avez votre TFDConnection (idéalement sur un TDataModule plutôt qu'une fiche, mais c'est à vous de voir).
Remplissez les propriétés VendorHome et VendorLib du TFDPhysMySQLDriverLink.
Changez la propriété ConnectedStoredUsage du TFDConnection pour n'activer la connexion par défaut que dans l'IDE (auDesignTime).

Au moment de la création de votre fiche ou de votre module de données il vous suffit de mettre le bon chemin pour VendorHome et VendorLib avant de lancer la connexion à la base de données à utiliser.

procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
{$IF Defined(WIN64)}
  FDPhysMySQLDriverLink1.VendorHome := 'C:/Program Files/HeidiSQL';
  FDPhysMySQLDriverLink1.VendorLib := '..l/ibmysql.dll';
{$ELSEIF Defined(WIN32)}
  FDPhysMySQLDriverLink1.VendorHome := 'C:/DevMySQL-Client/Win32';
  FDPhysMySQLDriverLink1.VendorLib := 'libmysql.dll';
{$ELSEIF Defined(LINUX)}
  FDPhysMySQLDriverLink1.VendorHome := '';
  FDPhysMySQLDriverLink1.VendorLib := '';
{$ELSE}
{$MESSAGE FATAL 'Platform not supported.'}
{$ENDIF}

  FDConnection1.Connected := true;
end;

Dans cet exemple j'utilise la DLL 64 bits incluse avec HeidiSQL et la vieille DLL 32 bits pour Windows.

Notez que FireDAC ajoute un “/lib” devant le nom de la DLL (ou son équivalent).

Dans l'exemple ci-dessus la version 64 bits est placée directement dans le dossier “C:/Program Files/HeidiSQL”. FireDAC cherchera “C:/Program Files/HeidiSQL/lib/libmysql.dll”, d'où le “../libmysql.dll” dans VendorLib. C'est de la bidouille, mais pas le choix, et puis ça passe très bien si on y pense.

La version 32 bits est dans le chemin “C:/Dev/MySQL-Client/Win32/lib” donc je n'ai rien à ajouter dans VendorLib.

Si vous ne mettez rien, le composant cherche libmysql.dll (ou son équivalent) dans le dossier du programme exécutable et quelques chemins d'accès courants. C'est pour ça que je n'ai rien spécifié pour Linux puisque j'y ai installé le paquet “libmariadb-dev” qui contient ce qu'il faut.

D'une façon générale, si vous en avez la possibilité, évitez d'embarquer ces DLLs dans vos projets et faites en sorte que les ordinateurs des utilisateurs aient les drivers officiels à jour (et maintenus). Ca limitera vos contraintes de maintenance de fichiers venant d'ailleurs qui peuvent contenir des failles de sécurité dont vous deviendriez responsable.

Une fois le driver chargé, la connexion va s'établir en passant par l'événement BeforeConnection du TFDConnection. C'est là que vous devez fournir les vrais paramètres de votre base de données si vous n'utilisez pas ceux que vous auriez configuré dans le concepteur de fiches.

procedure TDataModule2.FDConnection1BeforeConnect(Sender: TObject);
begin
{$IF Defined(MSWINDOWS)}
  FDConnection1.Params.Values['Database'] := 'yourDBname';
  FDConnection1.Params.Values['User_Name'] := 'yourDBuser';
  FDConnection1.Params.Values['Password'] := 'yourpassword';
  FDConnection1.Params.Values['Server'] := 'localhost';
  FDConnection1.Params.Values['Port'] := '3306';
{$ELSEIF Defined(LINUX)}
  FDConnection1.Params.Values['Database'] := 'yourDBname';
  FDConnection1.Params.Values['User_Name'] := 'yourDBuser';
  FDConnection1.Params.Values['Password'] := 'yourpassword';
  FDConnection1.Params.Values['Server'] := 'localhost';
  FDConnection1.Params.Values['Port'] := '3306';
{$ELSE}
{$MESSAGE FATAL 'Platform not supported.'}
{$ENDIF}
end;

Ici, je travaille avec un serveur de base de données locale selon le type de plateforme : Windows ou Linux. Les tentatives de compilation pour d'autres systèmes d'exploitation sont rejetées par les compilateurs.

Avec ça vous ne devriez pas avoir de difficultés pour travailler directement dans votre IDE avec une base de données de développement et exécuter vos programmes où vous voulez avec les bonnes dépendances pour l'accès à vos bases de données MariaDB ou MySQL.

Mastodon