이것은보다 일반화 된 클라이언트 측 함수이며 TDBXReader를 반환하는 다른 서버 측 프로 시저를 호출 할 수있게 해줍니다. 지금은 작동하지만 문제의 부부에 직면하고있어 그리고 난 당신의 도움이 필요합니다DataSnap 2010의 일반 요청 기능?
- ( 가장 중요)이 aproach에 대해 어떻게 생각하십니까? 어떤 제안/조언?
- 어떻게 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;
/way/over this control입니다. 서버 메서드를 직접 호출하지 않는 이유는 무엇입니까? 특정 서버 메소드를 호출하기위한 일반적인 함수를 작성하려고합니까? –
네, 그게 정확히 내가 쓰려고하는거야, 특정 서버 메소드를 호출하기위한 일반적인 함수. 나는 DataSets를 리턴하는 서버 메소드를 여러 개 가지고있다. 그래서 30 개의 클라이언트 메소드를 가지지 않고 하나의 클라이언트 메소드 만 있으면 더 좋을 것이다 (그리고 수정하기 쉽다). –