Delphi XE и ServerMethods - PullRequest
       47

Delphi XE и ServerMethods

0 голосов
/ 06 сентября 2011

В Delphi XE я создаю клиент-серверное приложение с помощью мастера «DataSnap Server».

В ServerMethodUnit Я определяю TSQLQuery со свойством sql, например, «Выбрать * из ТАБЛИЦЫ»

Я также определяю функцию с именем 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 property = 'Выбрать * из клиента' Я положил 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 провайдеру. Я положил TSQLServerMethod, называемый MyMethod, указывающий на ClientFilter в ServerMethodsUnit

в форме клиентского приложения Затем я положил A 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 Я вижу все записи таблицы клиентов, ВСЕГДА.

Я пробую фильтр ClientTable, нажимая на кнопку, но в DBGrid всегда отображаются все записи.

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Проблема здесь:

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

Когда вы назначаете идентификатор StrToInt(ID), вы не создаете параметр. Поэтому позже, когда вы сделаете `ParamByName ', чтобы изменить его, там нет параметров для изменения.

Измените строки выше на

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

Это должно решить проблему.

0 голосов
/ 06 сентября 2011

ответ на этот вопрос в DSServerClass1.LifeCycle.

Это был "вызов". Я изменился на «сессию».

Существует постоянное отключение к серверу с помощью «вызова», а затем восстанавливается значение по умолчанию.

Кто-нибудь знает, как работать с "вызовом"?

...