0

使用 Delphi XE,我使用“DataSnap Server”向导创建了一个客户端-服务器应用程序。

ServerMethodUnitI Define a TSQLQuerywith sql property like this "Select * from TABLE"

我也定义了一个调用的函数ChangeSQLServerMethodUnit通过示例更改sql属性SELECT * from TABLE where ID = 5

当我通过调用ChangeSQL表单客户端应用程序时TSQLServerMethodChangeSQL函数更改SQL属性ServerMethodUnit,但是当它离开函数ChangeSQL时,TSQLQuery不包含新的sql命令但有原始的sql。

编辑:添加代码示例

我使用“DataSnap Server”向导创建了一个新的客户端-服务器应用程序。

ServerMethodsUnit

我把一个TSQLConnection到我的数据库。我打了一个TSQLQuery电话MyQuerySQL属性 = '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和我的提供者。我在里面放了一个被调用的指向RemoteServerProviderNameMyQueryTSQLServerMethodMyMethodClientFilterServerMethodsUnit

在客户端应用程序的一个表格 然后我把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总是出现所有记录。

4

2 回答 2

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
// ------------------------------------------------ 

当您分配 IDStrToInt(ID)时,您不会创建参数。因此,稍后当您执行“ParamByName”来更改它时,那里没有要更改的参数。

将上面的行更改为

MyQuery.SQL.Text := `SELECT * FROM client WHERE ID  = :ID`;
MyQuery.ParamByName('ID').AsInteger := ID;
MyQuery.Open;

这应该可以解决问题。

于 2011-09-06T13:44:13.160 回答
0

DSServerClass1.LifeCycle 中的答案。

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

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

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

于 2011-09-06T18:47:47.003 回答