我找到了“OnQueryStatement”方法:
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查询语句?
提前谢谢! :)
答案 0 :(得分:3)
它在服务器上调用了两次(事实上,在最远的情况下,服务器上的同一查询可以被调用3次。)
检查Place参数以查看其调用的情况。 有可能 mwqotDefinition,mwqotQuery,mwqotExecute,mwqotResolve,mwqotMoreData,mwqotMetaData
在打开查询时多次调用它的原因是数据集首先想要获取定义(此查询将导致哪些字段和参数),然后是数据本身。
服务器和客户端默认都是这样运行的。因此,在客户端上打开查询会导致客户端向服务器询问定义,然后客户端请求数据,服务器上的数据可能导致服务器本身询问定义,然后是数据。请记住,服务器是无状态的,默认情况下不知道以前对它的调用。
有很多方法可以优化它:
启用元数据(定义)的缓存。这将导致使用缓存结果而不是服务器向数据库询问定义,并在客户端上启用缓存,导致客户端不必向服务器询问除第一次以外的定义。
< / LI>将查询的AutoFieldDefs属性设置为mwafoWithData。然后,数据实际上将与定义同时返回,并且将跳过2.nd数据提取调用。