Mappage des types de données (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Définition des options (FireDAC)


FireDAC fournit un système flexible et ajustable de mappage des types de données, qui vous permet de simplifier la migration vers FireDAC ou d'optimiser la représentation des données.

Informations générales

Le mappage des types de données vous permet de mapper :

  • les types de données des colonnes d'ensembles de résultats renvoyés par un pilote FireDAC sur les types de données préférés par l'application.
  • les types de données des paramètres de commande définis par une application sur les types de données supportés par le pilote.

Le mappage des types de données est utile pour :

  • la création du schéma de types de données compatible avec les autres composants d'accès aux données lors de la migration de l'application entre ces composants et FireDAC.
  • la création du schéma de types de données compatible avec plusieurs SGBD supportés lors du développement d'une application multi-SGBD.
  • le mappage des types de données non supportés par une application en types supportés.
  • le mappage des types de données généralisés supportés par un pilote en types plus spécialisés/pratiques.
  • l'optimisation de la consommation de mémoire, en spécifiant les types de données les plus optimisés.

Examinons une sélection (SELECT) de la colonne numérique d'une table Oracle et comment elle peut être mappée :

DDL Type de données du pilote Type de données préféré
NUMBER(2,0) dtBcd, Precision=2, Scale=0 dtSByte
NUMBER(4,0) dtBcd, Precision=4, Scale=0 dtInt16
NUMBER(8,0) dtBcd, Precision=8, Scale=0 dtInt32
NUMBER(18,0) dtBcd, Precision=18, Scale=4 dtCurrency

Comme vous pouvez le voir, le pilote Oracle renvoie un type de données unifié (dtBcd/dtFmtBCD) pour tous les types de base de données NUMBER(X,Y) possibles. Mais une application peut préférer utiliser un type de données plus spécialisé/pratique tel que dtInt32. Par ailleurs, FireDAC utilise une structure de données TBcd de 34 octets de long pour le type de données dtBcd/dtFmtBCD, et une structure de données Integer de 4 octets de long pour dtInt32.

Définition

FireDAC applique les règles de mappage lors de la préparation d'une commande. Une fois la commande préparée, la modification des règles n'a aucun effet. Si le type de données est conforme à plusieurs règles, seule la première est utilisée. Les propriétés MaxStringSize, MaxBcdPrecision, MaxBcdScale sont appliquées au type de source de données avant les règles de mappage.

Pour définir le mappage des types de données, une application doit définir FormatOptions.OwnMapRules sur True et remplir la collection MapRules. Chaque élément de la collection appartient à la classe TFDMapRule et représente une règle de mappage unique. Dans le cas d'une colonne d'ensemble de résultats, chaque règle définit une transformation d'un type de données source renvoyé par un pilote en un type cible préféré par une application. Dans le cas d'un paramètre de commande, chaque règle définit une transformation d'un type de données cible spécifié par une application en un type de données source supporté par un pilote. Toutes les règles, à l'exception de celles basées sur le nom, ont un fonctionnement bidirectionnel dans les deux cas.

Chaque règle est définie par les propriétés TFDMapRule :

Propriétés Description
PrecMin/PrecMax Définit l'étendue de la précision numérique des types de données source.
ScaleMin/ScaleMax Définit l'étendue de l'échelle numérique des types de données source.
SizeMin/SizeMax Définit l'étendue de la longueur de chaîne des types de données source.
SourceDataType Type de données source.
TargetDataType Type de données cible.
NameMask Masque du nom de la colonne.
TypeMask Masque du type de données de la colonne.

Si une précision, échelle ou taille n'est pas utilisée par la règle, sa valeur doit être de -1 (valeur par défaut). Si un type de données source est conforme à une certaine règle, un type de données de la colonne sera défini à l'aide du TargetDataType correspondant.

Exemple

Le code suivant permet de définir les règles de mappage de l'exemple ci-dessus :

 with FDConnection1.FormatOptions do begin
   OwnMapRules := True;
   with MapRules.Add do begin
     ScaleMin := 0;
     ScaleMax := 0;
     PrecMin := 0;
     PrecMax := 2;
     SourceDataType := dtBcd;
     TargetDataType := dtSByte;
   end;
   with MapRules.Add do begin
     ScaleMin := 0;
     ScaleMax := 0;
     PrecMin := 3;
     PrecMax := 4;
     SourceDataType := dtBcd;
     TargetDataType := dtInt16;
   end;
   with MapRules.Add do begin
     ScaleMin := 0;
     ScaleMax := 0;
     PrecMin := 5;
     PrecMax := 8;
     SourceDataType := dtBcd;
     TargetDataType := dtInt32;
   end;
   with MapRules.Add do begin
     ScaleMin := 4;
     ScaleMax := 4;
     PrecMin := 18;
     PrecMax := 18;
     SourceDataType := dtBcd;
     TargetDataType := dtCurrency;
   end;
 end;