2012-04-22 9 views
0

私は「OnQueryStatement」方法を見つけました:サーバー側でkbmMWクライアントクエリステートメントを取得する方法?

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

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

ありがとうございます! :)サーバー上の二回呼ば

p.s. Form1 is the server-side,form3 is the client-side

答えて

3

その(実際には最も遠くまで状況で、サーバー上の同じクエリのために3回呼び出すことができます)。

チェックのがで呼び出さ状況のための場所引数。 それは mwqotDefinition、mwqotQuery、mwqotExecute、mwqotResolve、mwqotMoreData、mwqotMetaData

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

サーバーとクライアントのデフォルトはどちらも同じように動作します。したがって、クライアント上でクエリを開くと、クライアントはサーバに定義について尋ねる結果になり、クライアントはデータを要求し、サーバ上ではサーバ自体が定義を求め、次にデータを要求することになります。サーバはステートレスであり、デフォルトはそれまでの呼び出しについて何も知らないことを忘れないでください。

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

  • は、メタデータ(定義)のキャッシュを有効にします。その結果、サーバーが定義のためにデータベースを要求する代わりにキャッシュの結果が使用され、クライアントのキャッシュも使用可能になるため、クライアントは初めてサーバー以外の定義をサーバーに要求する必要はありません。

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

+0

Kim Madsen、ありがとう! –

関連する問題