Search code examples
delphisocketsindy3-tier

How to get the kbmMW client query statement on server-side?


I found the "OnQueryStatement" method :

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

this method can get the client-side query statement,but all the client-side query trigger this event twince!(like the screenshot)!Why? How can i get the client-siade query statement correctly?

thanks in advance! :)

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


Solution

  • Its called twice on the server (in fact can be called 3 times for the same query on the server in the most far out situation).

    Check the Place argument for the situation that its called in. It can be mwqotDefinition,mwqotQuery,mwqotExecute,mwqotResolve,mwqotMoreData,mwqotMetaData

    The reason its being called multiple times when opening the query, is that the dataset first likes to get the definition (which fields and parameters will this query result in), and then the data itself.

    Both the server and the client default operates like that. Hence opening a query on the client result the client in asking the server about definitions, then the client asks for the data, and that on the server may result in the server itself asking for definitions and then the data. Remember the server is stateless and default doesnt know anything about previous calls to it.

    There are many ways to optimize this:

    • Enable caching for metadata (definitions). That will result in the cache results being used instead of the server asking the database for the definitions, and enabling the cache on the client too, results in the client not having to ask the server for definitions except first time.

    • Setup the AutoFieldDefs property on the query to mwafoWithData. Then the data will actually be returned at the same time as the definitions, and the 2.nd data fetch call will be skipped.