dbExpress-Anwendungen debuggen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Verwenden von dbExpress-Komponenten - Index


Beim Debuggen von Datenbankanwendungen ist die Überwachung der SQL-Nachrichten meist hilfreich, die über die Verbindungskomponente an den und von dem Datenbankserver gesendet werden, wobei auch die automatisch erzeugten Nachrichten berücksichtigt werden (beispielsweise von einer Provider-Komponente oder vom dbExpress-Treiber).

Überwachen von SQL-Anweisungen mit TSQLMonitor

TSQLConnection verwendet eine Zusatzkomponente, Data.SqlExpr.TSQLMonitor, um diese Nachrichten abzufangen und in einer Stringliste abzulegen. TSQLMonitor verhält sich ganz ähnlich wie das Dienstprogramm SQL-Monitor, das Sie in der BDE verwenden können, außer dass es nur die Anweisungen überwacht, die eine einzelne TSQLConnection-Komponente beinhalten, und nicht alle von dbExpress verwalteten Anweisungen.

So verwenden Sie TSQLMonitor:

  1. Fügen Sie dem Formular oder dem Datenmodul, das die TSQLConnection-Komponente enthält, deren SQL-Anweisungen Sie überwachen möchten, eine TSQLMonitor-Komponente hinzu.
  2. Setzen Sie die Eigenschaft SQLConnection auf die Komponente SQLConnection.
  3. Setzen Sie die Eigenschaft Active des SQL-Monitors auf True.

Flags für die Überwachung von SQL-Anweisungen

Anhand einer Reihe von Flags überwacht der Monitor die verschiedenen SQL-Anweisungen. Diese Flags können im Ereignis OnTrace wie im folgenden Beispiel verwendet werden:

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

Die folgende Tabelle enthält die Ablaufverfolgungs-Flags:

Flag Bedeutung

traceUNKNOWN

Alle SQL-Anweisungen

traceQPREPARE

Vorbereitete Abfragen, die an den Server gesendet werden.

traceQEXECUTE

Abfragen, die vom Server ausgeführt werden sollen. Eine einzelne Anweisung wird einmal vorbereitet und kann mit verschiedenen Parametern mehrmals ausgeführt werden.

traceERROR

Vom Server zurückgegebene Fehlermeldungen. Die Fehlermeldung kann - abhängig vom Server - auch einen Fehlercode enthalten.

traceSTMT

Auszuführende Operationen, wie ALLOCATE, PREPARE, EXECUTE und FETCH.

traceCONNECT

Operationen zum Hersteller von Verbindungen zu Datenbanken bzw. deren Aufhebung, einschließlich dem Zuweisen und Freigeben von Verbindungs-Handles, falls diese vom Server benötigt werden.

traceTRANSACT

Transaktionsoperationen, wie z.B. BEGIN, COMMIT und ROLLBACK (ABORT).

traceBLOB

Operationen mit BLOB-Daten (Binary Large Object ), einschließlich STORE BLOB, GET BLOB HANDLE usw.

traceMISC

Anweisungen, die von keinem anderen Flag überwacht werden.

traceVENDOR

API-Funktionsaufrufe an den Server. Beispielsweise ORLON für Oracle, ISC_ATTACH für InterBase.

traceDATAIN

Parameterdaten, die bei INSERT- oder UPDATE-Anweisungen an den Server gesendet werden.

traceDATAOUT

Daten, die von Servern abgerufen werden.

Wenn SQL-Anweisungen an den Server gesendet werden, wird die Eigenschaft TraceList des SQL-Monitors automatisch aktualisiert, sodass alle abgefangenen SQL-Anweisungen aufgelistet werden.

Sie können diese Liste in einer Datei speichern, indem Sie einen Wert für die Eigenschaft FileName angeben und dann die Eigenschaft AutoSave auf True setzen. AutoSave bewirkt, dass der SQL-Monitor den Inhalt der Eigenschaft TraceList immer dann in einer Datei speichert, wenn er eine neue Nachricht protokolliert hat.

Falls Sie verhindern möchten, dass bei jeder Protokollierung einer Nachricht eine Datei gespeichert wird, legen Sie in der Ereignisbehandlungsroutine Data.SqlExpr.TSQLMonitor.OnLogTrace fest, dass die Dateien erst gespeichert werden sollen, nachdem eine bestimmte Anzahl an Nachrichten protokolliert wurde. Die folgende Ereignisbehandlungsroutine speichert beispielsweise den Inhalt von TraceList nach jeder zehnten Nachricht und löscht das Protokoll nach dem Speichern, sodass die Liste nie zu lang wird:

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();
 }

Hinweis: Wenn Sie die oben gezeigte Ereignisbehandlungsroutine verwenden, sollten Sie auch Teillisten (mit weniger als 10 Einträgen) speichern, wenn die Anwendung heruntergefahren wird.

Überwachen von SQL-Anweisungen mit einem Callback

Anstatt der Verwendung von TSQLMonitor können Sie mit der Methode SetTraceEvent der SQL-Verbindungskomponente anpassen, wie Ihre Anwendung SQL-Anweisungen überwacht. SetTraceEvent übernimmt einen TDBXTraceEvent-Parameter.

Der dbExpress-Treiber löst das Ereignis immer dann aus, wenn die SQL-Verbindungskomponente dem Server einen Befehl übergibt oder wenn der Server eine Fehlermeldung zurückgibt.

Warnung: Rufen Sie SetTraceEvent nicht auf, wenn dem TSQLConnection-Objekt eine TSQLMonitor-Komponente zugeordnet ist. TSQLMonitor benötigt den Callback-Mechanismus, und TSQLConnection kann jeweils nur einen Callback unterstützen.

Siehe auch