使用Delphi XE,我使用“DataSnap Server”向导创建客户端 - 服务器应用程序。
在ServerMethodUnit
我使用sql属性定义TSQLQuery
,如此“从表中选择*”
我在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
属性='从客户端选择*'
我将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 CLient”创建了一个新的应用程序
在ClientModuleUni
中:
我将ClientDataSet
MyClientDS
与RemoteServer
和ProviderName
一起提供给我的MyQuery
提供商。
我在[{1}}
TSQLServerMethod
的{{1}}指向MyMethod
以客户端应用程序的形式
然后我将ClientFilter
和ServerMethodsUnit
放到DataSource
并打开它。
我添加了DBGrid
代码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
始终显示所有记录。
答案 0 :(得分:2)
问题在于:
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
// ------------------------------------------------
分配ID StrToInt(ID)
时,您不会创建参数。因此,稍后当您执行“ParamByName”更改它时,没有可更改的参数。
将上面的行更改为
MyQuery.SQL.Text := `SELECT * FROM client WHERE ID = :ID`;
MyQuery.ParamByName('ID').AsInteger := ID;
MyQuery.Open;
这应解决问题。
答案 1 :(得分:0)
DSServerClass1.LifeCycle中的答案。
这是“调用”。我已经改为“会话”了。
通过“调用”连续断开与服务器的连接,然后恢复默认值。
任何人都知道如何使用“调用”?