Функция обобщенного запроса в DataSnap 2010? - PullRequest
1 голос
/ 17 декабря 2009

Это клиентская функция, которую я пытаюсь построить, более обобщенная, которая позволит мне вызывать различные серверные процедуры, которые возвращают TDBXReader Прямо сейчас это работает, НО я столкнулся с парой проблем, и мне нужна ваша помощь:

  • ( самое важное ) что вы думаете об этом подходе? какие-либо предложения / советы?
  • как я могу освободить vLClient (который на самом деле является TSrvMethodClient)?
  • почему мне не разрешено передавать второй аргумент методу Create?

Спасибо.

function askServerTo_give(SQLConn: TSQLConnection; procName: String; cds: TClientDataSet): Boolean;
var
  ctx : TRttiContext;
  SrvRTTI: TRttiType;
  vLClient, vLReader: TValue;
  //LClient : TSrvMethodsClient;
begin
  Result := False;
  vLClient := nil;
  vLReader := nil;

  ctx := TRttiContext.Create;
  SrvRTTI := ctx.GetType(TSrvMethodsClient.ClassInfo);

  vLClient := SrvRTTI.GetMethod('Create').Invoke(SrvRTTI.AsInstance.MetaclassType, [ SQLConn.DBXConnection ] );

  //vLClient := SrvRTTI.GetMethod('Create').Invoke(SrvRTTI.AsInstance.MetaclassType, [ SQLConn.DBXConnection , False] ); // Error!  
  //LClient := TSrvMethodsClient.Create( SQLConn.DBXConnection, False);
  try
    vLReader := SrvRTTI.GetMethod( procName ).Invoke(vLClient, []);

    if (vLReader.AsObject as TDBXReader) <> nil then begin
      TDBXDataSetReader.CopyReaderToClientDataSet((vLReader.AsObject as TDBXReader), cds);
      Result := not cds.IsEmpty;
    end;
  finally
    (vLReader.AsObject as TDBXReader).Free; //FreeAndNil() doesn`t work
    //(vLClient.AsObject as TSrvMethodsClient).Free; // Error!  
    ctx.Free;
  end;
end;

1 Ответ

1 голос
/ 17 декабря 2009

Разве вы не дублируете способ, которым Datasnap вызывает удаленные методы? Смотрите, например, «Вызов методов сервера с использованием компонента TSQLServerMethod»

...