Migration d'applications BDE (FireDAC)
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.