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;

次の表に、追跡フラグの一覧を示します。

Flag 意味

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 接続コンポーネントがサーバーにコマンドを渡すかサーバーがエラー メッセージを返すたびに、イベントを発生させます。

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

関連項目