Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi DataSnap 2010中的通用请求函数?_Delphi_Delphi 2010_Rtti_Datasnap - Fatal编程技术网

Delphi DataSnap 2010中的通用请求函数?

Delphi DataSnap 2010中的通用请求函数?,delphi,delphi-2010,rtti,datasnap,Delphi,Delphi 2010,Rtti,Datasnap,这是我正在尝试构建的一个更通用的客户端函数,它允许我调用返回TDBXReader的不同服务器端过程。现在它可以工作了,但我面临两个问题,我需要你的帮助: (最重要的)你觉得这条路怎么样?有什么建议吗 如何释放vLClient(实际上是TSrvMethodClient) 为什么不允许我将第二个参数传递给Create方法 多谢各位 function askServerTo_give(SQLConn: TSQLConnection; procName: String; cds: TClientDa

这是我正在尝试构建的一个更通用的客户端函数,它允许我调用返回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;
函数askServerTo_give(SQLConn:TSQLConnection;procName:String;cds:TClientDataSet):布尔; 变量 ctx:trtti上下文; SrvRTTI:trtti型; vLClient,vLReader:TValue; //l客户:TSrvMethodsClient; 开始 结果:=假; vLClient:=零; vLReader:=零; 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]);//错误! //LClient:=TSrvMethodsClient.Create(SQLConn.DBXConnection,False); 尝试 vLReader:=SrvRTTI.GetMethod(procName).Invoke(vLClient,[]); 如果(vLReader.AsObject作为TDBXReader)为零,则开始 TDBXDataSetReader.CopyReaderToClientDataSet((vLReader.AsObject作为TDBXReader),CD); 结果:=非cds.IsEmpty; 结束; 最后 (vLReader.AsObject作为TDBXReader)。免费//FreeAndNil()不起作用 //(vLClient.AsObject作为TSrvMethodsClient)。免费;//错误! 免费; 结束; 结束;
您不是重复了Datasnap调用远程方法的方式吗?例如“使用TSQLServerMethod组件调用服务器方法”

您不是重复了Datasnap调用远程方法的方式吗?例如“使用TSQLServerMethod组件调用服务器方法”

在我看来,您似乎控制过度了——为什么不直接调用服务器方法呢?你想写一个调用特定服务器方法的通用函数吗?是的,这正是我想写的,一个调用特定服务器方法的通用函数。我有几个(比如说30个)返回数据集的服务器方法,因此我认为与其有30个客户端方法,不如只使用一个客户端方法(并且易于修改)。在我看来,您似乎控制过度了——为什么不直接调用服务器方法呢?你想写一个调用特定服务器方法的通用函数吗?是的,这正是我想写的,一个调用特定服务器方法的通用函数。我有几个(比如说30个)返回数据集的服务器方法,因此我认为,与其有30个客户端方法,不如只使用一个客户端方法(并且易于修改)。我看不出哪里有重复,请阅读我在原始帖子上的第一条评论,作为对Nick Hodges的回复。我看不到重复在哪里,请阅读我在原始帖子上的第一条评论,作为对尼克·霍奇斯的回复。