DataSnap 2010中的广义请求功能?

时间:2009-12-17 01:11:22

标签: delphi delphi-2010 rtti datasnap

这是我正在尝试构建的客户端功能,更通用,这将允许我调用返回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 个答案:

答案 0 :(得分:1)

您是不是在复制Datasnap调用远程方法的方式?查看示例“使用TSQLServerMethod组件调用服务器方法”