Delphi XE和ServerMethods

时间:2011-09-06 00:41:06

标签: delphi delphi-xe datasnap

使用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来电MyQuerySQL属性='从客户端选择*' 我将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 MyClientDSRemoteServerProviderName一起提供给我的MyQuery提供商。 我在[{1}}

中放了一个名为TSQLServerMethod的{​​{1}}指向MyMethod

以客户端应用程序的形式 然后我将ClientFilterServerMethodsUnit放到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始终显示所有记录。

2 个答案:

答案 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中的答案。

这是“调用”。我已经改为“会话”了。

通过“调用”连续断开与服务器的连接,然后恢复默认值。

任何人都知道如何使用“调用”?