5

FireDAC でマクロを使用して SQL クエリを前処理しようとしています。SQL が次のように設定されたデータ モジュールに TADQuery オブジェクトがあります。

Select * from MyTable
  join OtherTable on MyTable.Key = OtherTable.Key
&Where

次に、私のコードでこれを行います:

WhereClause = 'stuff based on my form';
Query.MacroByName('Where').AsRaw := WhereClause;
Query.Open;

これは、SQL プロパティ エディターを使用してフィールドと結合条件が正しいことを確認できるため、複雑なクエリでうまく機能します。

私の問題は、where 句が原因で SQL ステートメントが無効になることです。 実行される前処理後の SQL を確認する方法はありますか? 現在、FireDac エラーをキャッチし、EADDBEngineException オブジェクトにある SQL を表示しています。ただし、マクロを使用した元の SQL はまだ表示されています。エラーが発生した後にアクセスできない場合は、マクロの置換を強制的に実行して、デバッガーで SQL を調べて、何が問題なのかを確認することができます。

問題があれば、近い将来に SQL Server に移行することを目標に、MS Access データベースに接続しています。

4

2 に答える 2

2

Text プロパティを使用する以外に、実際にデータベース エンジンに送信される SQL を監視するには、「FDMonitor」FireDAC ユーティリティの使用を検討してください。DokWiki のページ (以下) によると:

  • フォームにTFDMoniRemoteClientLinkコンポーネントをドロップします。
  • その Tracing プロパティをTrueに設定し、
  • MonitorBy=Xxx 接続定義パラメーターを既存の FDConnection コンポーネントに追加します。FDConnection コンポーネントを選択し、Params プロパティを展開し、MonitorBy を mbRemote に設定することにより、IDE オブジェクト インスペクタでこれを行うことができます。

TFDMoniXxxxClientLink は、データ モジュールまたはフォームの作成順序で TFDConnection の前に配置する必要があることに注意してください。フォームまたはデータ モジュールを右クリックしてから、作成順序を選択し、TFDMoni.. コンポーネントを FDConnection の上に移動して調整します。

また、TFDMoniXxxxClientLink のオプションで、記録されるほとんどのイベントを無効にすると便利です。無効にしないと、返されたすべてのデータが FireDAC モニタにも表示されます。EventKinds プロパティを展開し、おそらく ekConnConnect、ekConnPrepare、および ekCmdExecute を除いて、すべての種類のイベントをオフにします。

次に、IDE から FireDAC モニタを開きます ([ツール] > [FireDAC モニタ])。モニターの実行中にのみアプリを起動します。トレース イベント ([Trace Output] タブ) をダブルクリックすると、データベースに送信された実際の SQL が下のペインに表示されます。

また、上記のように ekConnPrepare の EventType を追加すると、クエリの Prepare が呼び出されたときに表示される可能性がありますが、私はそれで十分に遊んでいません。

詳細については、DocWiki の次のページを参照してください。

概要: FDMonitor

方法:トレースと監視 (FireDAC)

その他の FireDAC ユーティリティ:ユーティリティ (FireDAC)

于 2016-08-23T11:02:52.267 に答える
1

(未回答の質問のリストからこの質問を削除するだけです)

コメントから:

さて、私はそこで何が起こっているのかを大まかに確認しましたが、Prepare を呼び出すことが (これは役に立たない) その前処理をトリガーするための最小要件であるかどうかはまだわかりません。ただし、前処理された SQL、DBMS に送信される SQL には、Textプロパティ (このようなプロパティの非常に珍しい名前) を介してアクセスできます。— TLama 14

于 2016-02-16T15:26:02.950 に答える