0

我找到了“OnQueryStatement”方法:

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

这个方法可以得到客户端的查询语句,但是所有的客户端查询都会触发这个事件两次!(如截图)!为什么?如何正确获取客户端查询语句?

提前致谢!:)

ps Form1 是服务器端,form3 是客户端

4

1 回答 1

3

它在服务器上调用了两次(实际上在最远的情况下,对于服务器上的相同查询可以调用 3 次)。

检查 Place 参数以了解其调用的情况。它可以是 mwqotDefinition、mwqotQuery、mwqotExecute、mwqotResolve、mwqotMoreData、mwqotMetaData

打开查询时多次调用它的原因是数据集首先喜欢获取定义(此查询将导致哪些字段和参数),然后是数据本身。

服务器和客户端默认都是这样操作的。因此,在客户端上打开查询会导致客户端向服务器询问定义,然后客户端询问数据,而在服务器上可能会导致服务器本身询问定义,然后询问数据。请记住,服务器是无状态的,默认情况下对以前的调用一无所知。

有很多方法可以优化这个:

  • 为元数据(定义)启用缓存。这将导致使用缓存结果而不是服务器向数据库询问定义,并且也在客户端上启用缓存,导致客户端除了第一次之外不必向服务器询问定义。

  • 将查询上的 AutoFieldDefs 属性设置为 mwafoWithData。然后数据实际上将与定义同时返回,并且将跳过第 2 次数据获取调用。

于 2012-04-22T10:13:10.967 回答