Delphi DataSnap 2010中的通用请求函数?
这是我正在尝试构建的一个更通用的客户端函数,它允许我调用返回TDBXReader的不同服务器端过程。现在它可以工作了,但我面临两个问题,我需要你的帮助: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
- (最重要的)你觉得这条路怎么样?有什么建议吗
- 如何释放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的回复。我看不到重复在哪里,请阅读我在原始帖子上的第一条评论,作为对尼克·霍奇斯的回复。