0

「OnQueryStatement」メソッドを見つけました:

procedure TkbmMWQueryService2.kbmMWQueryServiceQueryStatement(Sender: TObject;
Place: TkbmMWQueryOperationType; var NamedQueryName, Statement: string);
begin
   Form1.Memo1.Lines.Add(Statement);//show the query statement
end;

このメソッドはクライアント側のクエリ ステートメントを取得できますが、すべてのクライアント側のクエリがこのイベントを 2 回トリガーします!(スクリーンショットのように)!なぜですか? client-siade クエリステートメントを正しく取得するにはどうすればよいですか?

前もって感謝します!:)

ps Form1 はサーバー側、form3 はクライアント側です。

4

1 に答える 1

3

サーバー上で 2 回呼び出されます (実際、最も遠い状況では、サーバー上の同じクエリに対して 3 回呼び出すことができます)。

呼び出された状況の Place 引数を確認してください。

クエリを開くときに複数回呼び出される理由は、データセットが最初に定義 (このクエリの結果となるフィールドとパラメーター) を取得し、次にデータ自体を取得することです。

サーバーとクライアントの両方のデフォルトはそのように動作します。したがって、クライアントでクエリを開くと、クライアントはサーバーに定義について尋ね、次にクライアントはデータを要求し、サーバー上ではサーバー自体が定義を要求し、次にデータを要求する可能性があります。サーバーはステートレスであり、デフォルトはサーバーへの以前の呼び出しについて何も知らないことに注意してください。

これを最適化するには多くの方法があります。

  • メタデータ (定義) のキャッシュを有効にします。これにより、サーバーがデータベースに定義を要求する代わりにキャッシュ結果が使用され、クライアントでもキャッシュを有効にすると、クライアントは初回以外はサーバーに定義を要求する必要がなくなります。

  • クエリの AutoFieldDefs プロパティを mwafoWithData に設定します。その後、データは定義と同時に実際に返され、2 番目のデータ フェッチ呼び出しはスキップされます。

于 2012-04-22T10:13:10.967 に答える