【问题标题】:How to get the kbmMW client query statement on server-side?如何在服务器端获取kbmMW客户端查询语句?
【发布时间】:2012-05-03 02:52:32
【问题描述】:

我找到了“OnQueryStatement”方法:

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

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

提前致谢! :)

【问题讨论】:

    标签: delphi sockets indy 3-tier


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      相关资源
      最近更新 更多