Débogage d'applications dbExpress

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des composants dbExpress - Index


Lors du débogage de votre application de base de données, il peut s'avérer utile de contrôler les messages SQL envoyés à la base de données et reçus de celle-ci par le biais de votre composant connexion, y compris ceux automatiquement générés (par exemple, par un composant fournisseur ou par le pilote dbExpress).

Utilisation de TSQLMonitor pour contrôler les commandes SQL

TSQLConnection utilise un composant compagnon, Data.SqlExpr.TSQLMonitor, pour intercepter ces messages et les enregistrer dans une liste de chaînes. TSQLMonitor fonctionne comme l'utilitaire moniteur SQL que vous pouvez utiliser avec le BDE, à la différence qu'il contrôle uniquement les commandes impliquant un seul composant TSQLConnection plutôt que toutes les commandes gérées par dbExpress.

Pour utiliser TSQLMonitor

  1. Ajoutez un composant TSQLMonitor à la fiche ou au module de données contenant le composant TSQLConnection dont vous souhaitez contrôler les commandes SQL.
  2. Définissez sa propriété SQLConnection sur le composant TSQLConnection.
  3. Définissez la propriété Active du moniteur SQL sur True.

Indicateurs de contrôle des commandes SQL

Un certain nombre d'indicateurs sont présents pour vous aider à contrôler les diverses commandes SQL. Ils peuvent être utilisés dans l'événement OnTrace comme dans l'exemple suivant :

 procedure TForm26.SQLMonitor1Trace(Sender: TObject; TraceInfo: TDBXTraceInfo; var LogTrace: Boolean);
 begin
   if TraceInfo.TraceFlag = TDBXTraceFlags.Execute then
   begin
     { statement }
   end;
 end;

Le tableau suivant présente la liste des indicateurs de trace :

Indicateur Signification

traceUNKNOWN

Toutes les commandes SQL.

traceQPREPARE

Requêtes préparées envoyées au serveur.

traceQEXECUTE

Requêtes à exécuter par le serveur. Une même instruction peut être préparée une seule fois puis exécutée plusieurs fois avec différentes liaisons de paramètres.

traceERROR

Messages d'erreur renvoyés par le serveur. Le message d'erreur peut comprendre un code d'erreur, suivant le serveur.

traceSTMT

Opérations à effectuer telles que ALLOCATE, PREPARE, EXECUTE et FETCH.

traceCONNECT

Opérations associées à la connexion et à la déconnexion de bases de données, y compris l'allocation et la libération des descripteurs de connexion, suivant le serveur.

traceTRANSACT

Opérations transactionnelles telles que BEGIN, COMMIT et ROLLBACK (ABORT).

traceBLOB

Opérations sur des données BLOB (Binary Large Object), notamment STORE BLOB, GET BLOB HANDLE, etc.

traceMISC

Commandes non couvertes par un autre indicateur.

traceVENDOR

Appels de fonction API au serveur. Par exemple, ORLON pour Oracle, ISC_ATTACH pour InterBase.

traceDATAIN

Données de paramètres envoyées aux serveurs au moment d'effectuer des insertions ou des mises à jour.

traceDATAOUT

Données extraites des serveurs.

Au fur et à mesure que les commandes SQL sont envoyées au serveur, la propriété TraceList du moniteur SQL est automatiquement mise à jour afin de présenter toutes les commandes SQL interceptées.

Vous pouvez enregistrer cette liste dans un fichier en spécifiant une valeur pour la propriété FileName puis en attribuant à la propriété AutoSave la valeur True. AutoSave oblige le moniteur SQL à enregistrer le contenu de la propriété TraceList dans un fichier à chaque consignation d'un nouveau message.

Si vous voulez épargner à votre système la charge liée à l'enregistrement d’un fichier à chaque consignation d'un message, vous pouvez utiliser le gestionnaire d'événements Data.SqlExpr.TSQLMonitor.OnLogTrace afin de n'enregistrer des fichiers qu'à la suite d'un certain nombre de consignations de messages. Par exemple, le gestionnaire d'événements suivant enregistre le contenu de TraceList tous les 10 messages et efface le journal après l'avoir enregistré afin de limiter la longueur de la liste :

 procedure TForm1.SQLMonitor1LogTrace(Sender: TObject; CBInfo: Pointer);
 var
   LogFileName: string;
 begin
   with Sender as TSQLMonitor do
   begin
     if TraceCount = 10 then
     begin
       LogFileName := 'c:\log' + IntToStr(Tag) + '.txt';
       Tag := Tag + 1; {ensure next log file has a different name }
       SaveToFile(LogFileName);
       TraceList.Clear; { clear list }
     end;
   end;
 end;
 void __fastcall TForm1::SQLMonitor1LogTrace(TObject *Sender, void *CBInfo)
 {
   TSQLMonitor *pMonitor = dynamic_cast<TSQLMonitor *>(Sender);
   if (pMonitor->TraceCount == 10)
   {
     // build unique file name
     AnsiString LogFileName = "c:\\log";
     LogFileName = LogFileName + IntToStr(pMonitor->Tag);
     LogFileName = LogFileName + ".txt"
     pMonitor->Tag = pMonitor->Tag + 1;
     // Save contents of log and clear the list
     pMonitor->SaveToFile(LogFileName);
     pMonitor->TraceList->Clear();
 }

Remarque : Le gestionnaire d'événements précédent vous permet également d'enregistrer une liste qui s'avère partielle (contenant moins de 10 entrées) à l'arrêt de l'application.

Utilisation d'un rappel pour contrôler les commandes SQL

Au lieu d'utiliser TSQLMonitor, vous pouvez personnaliser la façon dont votre application assure le suivi des commandes SQL en recourant à la méthode SetTraceEvent du composant connexion SQL. SetTraceEvent accepte un paramètre TDBXTraceEvent.

Le pilote dbExpress déclenche l'événement chaque fois que le composant connexion SQL transmet une commande au serveur ou que celui-ci renvoie un message d'erreur.

Avertissement : N'appelez pas SetTraceEvent si l'objet TSQLConnection est associé à un composant TSQLMonitor. TSQLMonitor utilise le mécanisme de rappel pour fonctionner et TSQLConnection ne peut prendre en charge qu'un rappel à la fois.

Voir aussi