2012-04-22 51 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(如截圖)爲什麼!?我怎樣才能正確地獲得客戶端siade查詢語句?

在此先感謝! :)

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

回答

3

它在服務器上調用兩次(其實可以被稱爲3次,在最遙遠的情況在服務器上相同的查詢)。

檢查,其在所謂形勢的地方的說法。 它可以是 mwqotDefinition,mwqotQuery,mwqotExecute,mwqotResolve,mwqotMoreData,mwqotMetaData

原因打開查詢時,它被稱爲多次,是數據集首先喜歡得到定義(這個查詢結果將包含哪些字段和參數),然後是數據本身。

服務器和客戶端默認都是這樣操作的。因此,在客戶端上打開查詢會導致客戶端詢問服務器的定義,然後客戶端會詢問數據,而服務器上的數據可能會導致服務器本身要求定義,然後導致數據。記住服務器是無狀態的,默認不知道以前對它的調用。

有很多方法來優化這個:

  • 啓用元數據(定義)高速緩存。這將導致使用緩存結果而不是服務器向數據庫請求定義,並在客戶端啓用緩存,導致客戶端無需向服務器詢問除第一次以外的定義。

  • 將查詢的AutoFieldDefs屬性設置爲mwafoWithData。然後,數據實際上將與定義同時返回,並且第2次數據獲取調用將被跳過。

+0

金馬德森,非常感謝你! – 2012-04-23 06:34:05