如何在服务器端获取kbmMW客户端查询语句?

时间:2012-04-22 01:39:25

标签: delphi sockets indy 3-tier

我找到了“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查询语句?

提前谢谢! :)

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

1 个答案:

答案 0 :(得分:3)

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

检查Place参数以查看其调用的情况。 有可能   mwqotDefinition,mwqotQuery,mwqotExecute,mwqotResolve,mwqotMoreData,mwqotMetaData

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

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

有很多方法可以优化它:

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

    < / LI>
  • 将查询的AutoFieldDefs属性设置为mwafoWithData。然后,数据实际上将与定义同时返回,并且将跳过2.nd数据提取调用。