2012-04-22 52 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