Génération de commandes de mise à jour (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Modification des données (FireDAC)

Informations générales

Lorsque l'application de base de données appelle les méthodes d'ensembles de données suivantes, le mode Mises à jour est différent :

et les commandes SQL de mise à jour des données sont automatiquement générées par FireDAC. Le générateur de commandes SQL de FireDAC tient compte des champs identité, des séquences, des déclencheurs, des types de données spéciaux (Oracle BLOB / CLOB / BFILE, et ainsi de suite) de la base de données et génère une commande SQL efficace, en fonction du SGBD connecté. Cela diminue le nombre de cas dans lesquels le développeur doit utiliser les commandes SQL manuelles. FireDAC ne force pas un développeur à utiliser TFDUpdateSQL, qui peut servir à redéfinir les commandes SQL de mise à jour.

Par exemple, lors de la validation d'un nouvel enregistrement dans une table Oracle, où le champ ID est renseigné par un déclencheur à partir d'une séquence, et si IMAGE est de type BLOB, FireDAC génère la commande SQL suivante :

 INSERT INTO OracleTab (NAME, DT, IMAGE)
 VALUES (:NEW_NAME, :NEW_DT, EMPTY_BLOB())
 RETURNING :NEW_ID, :NEW_IMAGE

1. Phrases FROM, INTO et UPDATE

FireDAC utilise la table principale (la première table) dans l'instruction SELECT ... FROM ... comme nom de table de mise à jour. Cette table est également utilisée pour extraire les métadonnées de mkPrimaryKeyFields. Utilisez UpdateOptions.UpdateTableName pour spécifier explicitement la table de mise à jour. Cela est nécessaire lorsque :

  • l'ensemble de données est TFDStoredProc ;
  • TFDQuery ne contient pas de requête SELECT ;
  • FireDAC échoue à obtenir le nom de la table de mise à jour à partir de la requête ;
  • l'application doit rediriger les mises à jour vers une table spécifique.

2. Phrase WHERE

La méthode UpdateOptions.UpdateMode contrôle la génération de la clause WHERE pour la validation des mises à jour et des suppressions. La valeur par défaut upWhereKeyOnly utilise uniquement les colonnes d'identification unique dans la phrase WHERE et fournit un moyen efficace et sécurisé pour localiser la ligne de mise à jour. Lorsqu'aucune colonne d'identification unique n'est spécifiée et qu'aucune colonne d'identification de ligne n'est trouvée, FireDAC remplace la valeur de la méthode UpdateOptions.UpdateMode par upWhereAll. Les champs suivants inclus dans la clause WHERE peuvent générer une erreur "aucune ligne trouvée" :

  • les champs DOUBLE, FLOAT, TIME et DATETIME, ainsi que d'autres champs à virgule flottante peuvent entraîner une perte de précision lors de la comparaison des valeurs ;
  • les champs textuels peuvent comporter un codage non valide ou des espaces supplémentaires entraînant l'échec des comparaisons ;
  • d'autres échecs similaires peuvent se produire.

Dans de telles situations, l'application obtient une exception :

 [FireDAC][DApt]-400. Update command updated [0] instead of [1] record.

De même, lorsque des colonnes de la phrase WHERE n'identifient pas de manière unique une ligne, il est possible que plusieurs enregistrements soient mis à jour au lieu d'un seul. L'exception est alors la suivante :

 [FireDAC][DApt]-400. Update command updated [4] instead of [1] record.

Pour résoudre ces problèmes, vous pouvez envisager les solutions suivantes :

Remarque : Pour éviter les problèmes ci-dessus avec une table SQL Server, qui comporte également des déclencheurs, le paramètre SET NOCOUNT ON doit être spécifié au début des déclencheurs. Si cela n'est pas possible, définissez UpdateOptions.CountUpdatedRecords sur False.

3. Phrases SET et VALUES

UpdateOptions.UpdateChangedFields contrôle les champs à inclure dans les phrases UPDATE SET ... ou INSERT VALUES .... Lorsque cette méthode est définie sur True, seuls les champs modifiés sont inclus, ce qui permet :

  • de minimiser le trafic lors de la validation des mises à jour ;
  • d'éviter les validations de contraintes inutiles ;
  • d'éviter des activations supplémentaires de déclencheurs ;
  • de minimiser la génération de journaux de rétablissement.

Lorsque la méthode est définie sur False tous les champs sont inclus, ce qui permet de réutiliser la même instruction générée pour la validation de toutes les mises à jour et de minimiser les opérations du SGBD pour préparer les instructions.

Pour désactiver des mises à jour de colonnes, excluez pfInUpdate de la propriété TField.ProviderFlags correspondante.

4. Phrase RETURNING et phrases SELECT supplémentaires

UpdateOptions.RefreshMode = rmOnDemand contrôle l'actualisation automatique des valeurs de la colonne, qui peuvent être modifiées par le SGBD après l'insertion ou la mise à jour d'un enregistrement. Les colonnes qui peuvent nécessiter une actualisation après l'insertion d'un enregistrement sont les suivantes :

  • colonnes auto-incrémentées ;
  • colonnes calculées de bases de données ;
  • colonnes comportant des valeurs par défaut ;
  • colonnes d'identification de ligne ;
  • colonnes d'horodatage ;
  • colonnes mises à jour par un déclencheur.

Les colonnes qui peuvent nécessiter une actualisation après la mise à jour d'un enregistrement sont les suivantes :

  • colonnes calculées de bases de données ;
  • colonnes d'horodatage ;
  • colonnes mises à jour par un déclencheur.

Selon les fonctionnalités du SGBD, les phrases / commandes supplémentaires suivantes sont générées, retournant des valeurs de colonne actualisées :

  • Oracle, Firebird, PostgreSQL - la phrase RETURNING ;
  • DB2 - la phrase SELECT ... FROM FINAL TABLE ;
  • SQL Server, SQL Anywhere, SQLite - le traitement par lot SQL avec une commande SELECT supplémentaire ;
  • sinon - une commande SELECT supplémentaire.

5. Mise en cache de commandes de mises à jour

Parfois, le fait de définir UpdateChangedFields sur False peut améliorer les performances. Par ailleurs, si ce paramètre est combiné à plusieurs autres paramètres, comme une propriété UpdateOptions.FastUpdates, il est possible d'améliorer encore les performances lors de la validation des mises à jour en évitant les requêtes supplémentaires et en activant la mise en cache des commandes de mise à jour générées.

FastUpdates = True est équivalent à :

Voir aussi