Migration d'applications BDE (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Migration des applications BDE vers FireDAC


Cet exemple explique étape par étape la migration de l'application démo EmbarcaderoDelphi classique - MastApp - vers FireDAC et le SGBD InterBase.

Etape 1

Accédez au dossier C:\Utilisateurs\Public\Documents\Embarcadero\Studio\22.0\Samples\Object Pascal\Database\FireDAC\Tool\reFind\BDE2FDMigration\Demo. Il contient la copie des sources de l'application MastApp. Créez un nouveau sous-répertoire, FireDAC_MastApp. Ensuite, copiez les fichiers source MastApp dans ce nouveau sous-répertoire pour conserver les sources originales.

Etape 2

Ouvrez une fenêtre cmd et indiquez le répertoire FireDAC_MastApp, ou utilisez votre gestionnaire de répertoires favori, par exemple FAR. Exécutez l'outil RAD Studio reFind pour remplacer les termes BDE par leurs synonymes FireDAC :

C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\reFind.exe *.pas *.dfm /X:C:\Utilisateurs\Public\Documents\Embarcadero\Studio\22.0\Samples\Object Pascal\Database\FireDAC\Tool\reFind\BDE2FDMigration\FireDAC_Migrate_BDE.txt.

Etape 3

Créez une définition de connexion FireDAC en utilisant l'explorateur FireDAC. Ensuite, configurez les paramètres de la définition de connexion. Voici la définition de connexion la plus simple pour MastApp :

[MASTSQL]
DriverID=IB
Protocol=TCPIP
Server=127.0.0.1
DataBase=C:\MastApp.GDB
User_Name=sysdba
SQLDialect=3
CharacterSet=UTF8
ExtendedMetadata=True

Remarque : Cela implique que vous avez créé une base de données InterBase C:\MastApp.GDB et chargé une base de données DBDEMOS (Paradox) dans la base de données C:\MastApp.GDB. Pour cela, vous pouvez utiliser Clever Components InterBase DataPump.

Etape 4

Ajoutez à l'application un pilote FireDAC spécifique au SGBD. Ajoutez une des unités FireDAC.Phys.[ID du pilote SGBD] à votre projet. Par exemple, si vous utilisez Oracle, ajoutez FireDAC.Phys.IB au projet. Puis, ajoutez l'unité FireDAC.VCLUI.Wait à votre projet :

program Mastapp;

uses
  Forms,
  FireDAC.Phys.IB,
  FireDAC.VCLUI.Wait,
  MAIN in 'MAIN.PAS' {MainForm},
  // …

Etape 5

A présent, ouvrez le fichier DataMod.dfm en utilisant un éditeur de texte. Définissez le composant TFDConnection dans le module de données. Définissez ConnectionDefName sur une définition de connexion InterBase. Remplacez également le nom d'utilisateur et le mot de passe par ceux qui conviennent. Le résultat ressemble à ce qui suit

Params.Strings = (
  'ConnectionDef=MASTSQL'
  'User_Name=sysdba'
  'Password=masterkey')

Etape 6

Les pilotes SQLLink InterBase et InterBase FireDAC ont des mappages de types de données différents. Nous devons donc procéder à un ajustement pour que le mappage de type FireDAC soit compatible avec BDE. Sinon, nous devrons recréer tous les champs persistants. Pour configurer le mappage de données, nous devons renseigner correctement la propriété collection TFDConnection.FormatOptions.MapRules. Faisons-le dans DataMod.DFM :

object Database: TFDConnection
  // …
  FormatOptions.OwnMapRules = True
  FormatOptions.MapRules = <
    item
      PrecMax = 10
      PrecMin = 0
      ScaleMax = 0
      ScaleMin = 0
      SourceDataType = dtFmtBCD
      TargetDataType = dtInt32
    end
    item
      SourceDataType = dtFmtBCD
      TargetDataType = dtDouble
    end
    item
      SourceDataType = dtDateTimeStamp
      TargetDataType = dtDateTime
    end>
  // …
end

Définissez également la propriété FormatOptions.StrsTrim sur False, car la valeur par défaut de cette propriété n'est pas compatible avec le BDE.

Etape 7

FireDAC ne prend pas en charge pas les bases de données de bureau, comme Paradox ou Dbase. Nous devons donc supprimer tout le code des bases de données de bureau (Paradox, Dbase) de l'application :

  • La méthode TMastData.UseLocalData dans DataMod.pas.
  • La méthode TMainForm.ViewLocalClick dans Main.pas.

Etape 8

Nous devons maintenant ajuster le code source de l'application pour InterBase :

  • Dans la méthode TMainForm.ViewRemoteClick du fichier Main.pas, remplacez la chaîne ' (Local Interbase)' par ' (InterBase)'.
  • Supprimez le gestionnaire TMainForm.ViewMenuClick dans Main.pas.
  • Supprimez la méthode TMastData.DataDirectory dans DataMod.pas.
  • L'application crée à la volée une définition de connexion à la base de données s'il n'en existe pas. Donc, dans DataMod.pas, remplacez TMastData.UseRemoteData par :
procedure TMastData.UseRemoteData;
var
  Params: TStringList;
begin
  { See if the ConnectionDef exists.  If not, add it. }
  if not FDManager.IsConnectionDef('MASTSQL') then
  begin
    Params := TStringList.create;
    try
      Params.Values['Protocol'] := 'TCPIP';
      Params.Values['Server'] := '127.0.0.1';
      Params.Values['DataBase'] := 'C:\MastApp.GDB';
      Params.Values['User_Name'] := 'sysdba';
      Params.Values['SQLDialect'] := '3';
      Params.Values['CharacterSet'] := 'UTF8';
      Params.Values['ExtendedMetadata'] := 'True';
      FDManager.AddConnectionDef('MASTSQL', 'IB', Params);
    finally
      Params.Free;
    end;
  end;
  SetDatabaseConnectionDef('MASTSQL');
end;
  • Nous devons ajuster les commandes SQL utilisées par les applications. Dans DataMod, la requête CustByLastInvQuery utilise DESCENDING comme mot clé, alors que InterBase utilise DESC.