dbExpress アプリケーションのデバッグ
DbExpress コンポーネントの利用:インデックス への移動
データベース アプリケーションのデバッグ時には、プロバイダ コンポーネントや dbExpress ドライバなどによって自動生成されたものも含めて、接続コンポーネントを通してデータベース サーバーとの間でやり取りされる SQL メッセージを監視すると有益な場合があります。
TSQLMonitor を使って SQL コマンドを監視する
TSQLConnection は関連コンポーネント、Data.SqlExpr.TSQLMonitor を使用し、これらのメッセージを一度受信し、それらを文字列リストに保存します。TSQLMonitor は BDE で使用できる SQL モニタ ユーティリティと同様の機能ですが、監視対象は異なり、dbExpress で管理されるすべてのコマンドではなく、1 つの TSQLConnection コンポーネントに関連するコマンドだけになります。
TSQLMonitor を使用するには:
- SQL コマンドを監視したい TSQLConnection コンポーネントが含まれるフォームまたはデータ モジュールに TSQLMonitor コンポーネントを追加します。
- その SQLConnection プロパティを、TSQLConnection コンポーネントに設定します。
- 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 つのコールバックしかサポートできません。