2009-12-17 4 views
1

이것은보다 일반화 된 클라이언트 측 함수이며 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; 
+0

/way/over this control입니다. 서버 메서드를 직접 호출하지 않는 이유는 무엇입니까? 특정 서버 메소드를 호출하기위한 일반적인 함수를 작성하려고합니까? –

+0

네, 그게 정확히 내가 쓰려고하는거야, 특정 서버 메소드를 호출하기위한 일반적인 함수. 나는 DataSets를 리턴하는 서버 메소드를 여러 개 가지고있다. 그래서 30 개의 클라이언트 메소드를 가지지 않고 하나의 클라이언트 메소드 만 있으면 더 좋을 것이다 (그리고 수정하기 쉽다). –

답변

1

Datasnap에서 원격 메소드를 호출하는 방식을 복제하지 않습니까? "TSQLServerMethod 구성 요소를 사용하여 서버 메서드 호출"예제를 찾으십시오.

+0

중복되는 부분이 보이지 않습니다. Nick Hodges에 대한 회신으로 원본 게시물에 대한 저의 첫 코멘트를 읽어주십시오. –

+0

http://edn.embarcadero.com/print/38682#4CallingservermethodsusingTSQLServerMethodcomponent –