dbExpress アプリケーションのデバッグ

提供: RAD Studio
移動先: 案内検索

dbExpress コンポーネントの使い方:インデックス への移動

データベース アプリケーションのデバッグ時には、プロバイダ コンポーネントや dbExpress ドライバなどによって自動生成されたものも含めて、接続コンポーネントを通してデータベース サーバーとの間でやり取りされる SQL メッセージを監視すると有益な場合があります。

TSQLMonitor を使って SQL コマンドを監視する

TSQLConnection は、関連コンポーネントである Data.SqlExpr.TSQLMonitor を使用して、メッセージをインターセプトし、文字列リストに保存します。TSQLMonitor は BDE で使用できる SQL モニタ ユーティリティと同様の機能ですが、監視対象は異なり、dbExpress で管理されるすべてのコマンドではなく、1 つの TSQLConnection コンポーネントに関連するコマンドだけになります。

TSQLMonitor を使用するには:

  1. SQL コマンドを監視したい TSQLConnection コンポーネントが含まれるフォームまたはデータ モジュールに TSQLMonitor コンポーネントを追加します。
  2. その SQLConnection プロパティを TSQLConnection コンポーネントに設定します。
  3. SQL モニタの Active プロパティを True に設定します。

SQL コマンド監視用のフラグ

さまざまな SQL コマンドを監視できるよう、いくつものフラグが用意されています。これらのフラグは、OnTrace イベント内で次の例のように使用することができます。

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

次の表に、トレース フラグの一覧を示します。

フラグ 意味

traceUNKNOWN

すべての SQL コマンド。

traceQPREPARE

サーバーに送信した準備済みのクエリ。

traceQEXECUTE

サーバーによって実行される予定のクエリ。ただし、一度準備した 1 つの文を、パラメータ バインディングを変えて何度も実行することが可能です。

traceERROR

サーバーから返されたエラー メッセージ。サーバーによっては、このエラー メッセージにエラー コードが含まれる場合があります。

traceSTMT

ALLOCATE、PREPARE、EXECUTE、FETCH など、実行される予定の操作。

traceCONNECT

データベースとの接続および接続解除に関連する操作。サーバーによって必要な場合には、接続ハンドルの割り当てや解放を含みます。

traceTRANSACT

BEGIN、COMMIT、ROLLBACK(ABORT)などのトランザクション操作。

traceBLOB

STORE BLOB、GET BLOB HANDLE など、BLOB(バイナリ ラージ オブジェクト)データに対する操作。

traceMISC

他のフラグで扱わないコマンド。

traceVENDOR

サーバーに対する API 関数呼び出し。Oracle の ORLON、InterBase の ISC_ATTACH など。

traceDATAIN

INSERT または UPDATE の実行時にサーバーに送信したパラメータ データ。

traceDATAOUT

サーバーから取得したデータ。

SQL コマンドがサーバーに送信されると、SQL モニタの TraceList プロパティが自動的に更新され、インターセプトされたすべての SQL コマンドがリストに記録されます。

FileName プロパティの値を指定し、AutoSave プロパティを True に設定すると、このリストをファイルに保存することができます。AutoSave を設定すると、SQL モニタは、新しいメッセージを記録するたびに、TraceList プロパティの内容をファイルに保存します。

メッセージの記録のたびにファイルを保存する処理のオーバーヘッドを回避したい場合は、Data.SqlExpr.TSQLMonitor.OnLogTrace イベント ハンドラを使って、一定数のメッセージが記録された後にのみファイルを保存することができます。たとえば次のイベント ハンドラでは、10 個目のメッセージごとに TraceList の内容を保存し、保存した後でログをクリアして、リストが長くなりすぎないようにしています。

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

メモ: 上記のイベント ハンドラを使用する場合には、アプリケーションの終了時に 10 個に満たないリストを保存する必要もあります。

コールバックを使って SQL コマンドを監視する

TSQLMonitor を使用する代わりに、SQL 接続コンポーネントの SetTraceEvent メソッドを使用すると、アプリケーションが SQL コマンドを追跡する方法をカスタマイズすることができます。SetTraceEvent は TDBXTraceEvent パラメータを受け取ります。

dbExpress ドライバは、SQL 接続コンポーネントがサーバーにコマンドを渡すかサーバーがエラー メッセージを返すたびに、イベントを発生させます。

警告: TSQLConnection オブジェクトに TSQLMonitor コンポーネントが関連付けられている場合には SetTraceEvent を呼び出さないでください。TSQLMonitor はコールバック メカニズムを使って動作しており、TSQLConnection は一度に 1 つのコールバックしかサポートできません。

関連項目