使用 Delphi XE,我使用“DataSnap Server”向导创建了一个客户端-服务器应用程序。
在ServerMethodUnit
I Define a TSQLQuery
with sql property like this "Select * from TABLE"
我也定义了一个调用的函数ChangeSQL
,ServerMethodUnit
通过示例更改sql属性SELECT * from TABLE where ID = 5
当我通过调用ChangeSQL
表单客户端应用程序时TSQLServerMethod
,ChangeSQL
函数更改SQL
属性ServerMethodUnit
,但是当它离开函数ChangeSQL
时,TSQLQuery
不包含新的sql命令但有原始的sql。
编辑:添加代码示例
我使用“DataSnap Server”向导创建了一个新的客户端-服务器应用程序。
在ServerMethodsUnit
:
我把一个TSQLConnection
到我的数据库。我打了一个TSQLQuery
电话MyQuery
,SQL
属性 = 'Select * from client' 我把TDataSetProvider
一个TSQLQuery
并定义一个这样的函数:
function TServerMethods1.ClientFiltrer (ID:integer):integer;
begin
//------------------------------------------------ // 此时,MyQuery.RecordCount = 所有记录(包括第一次和以后) // --------------------------- ---------------------
if MyQuery.Active then
MyQuery.close;
MyQuery.SQL.Clear;
MyQuery.SQL.Add(' SELECT * from CLIENT where ID = '+StrToInt (ID));
MyQuery.Open;
result := MyQuery.RecordCount;
// ------------------------------------------------
// At this point, MyQuery.RecordCount = ONE record
// ------------------------------------------------
end;
然后我使用“DataSnap 客户端”创建一个新应用程序
在ClientModuleUni
: 我放了一个,ClientDataSet
调用MyClientDS
和我的提供者。我在里面放了一个被调用的指向RemoteServer
ProviderName
MyQuery
TSQLServerMethod
MyMethod
ClientFilter
ServerMethodsUnit
在客户端应用程序的一个表格 然后我把ADataSource
和aDBGrid
放到MyClientDs
并打开它。我放了一个Tbutton
代码OnClick
:
begin
MyClientDs .Close;
MyMethod .ParamByName('ID').Value := 5;
MyMethod .ExecuteMethod;
showmessage (MyMethod .ParamByName('ID').AsString);
// AT THIS POINT, returned value is ONE.
// I supposed that this Query had been filtered on
// the server and the client then show the filtered
// data, but it always shows the original query
MyClientDs .Close;
end;
在DBGrid
我看到客户端表的所有记录中,总是。
我尝试过滤ClientTable
单击按钮,但DBGrid
总是出现所有记录。