2009-12-17 13 views
1

C'est une fonction côté client que j'essaye de construire, plus généralisée, qui me permettra d'appeler différentes procédures côté serveur qui retournent TDBXReader. En ce moment, cela fonctionne, mais je suis face à quelques problèmes et j'ai besoin de votre aide:fonction de requête généralisée dans DataSnap 2010?

  • (le plus important) que pensez-vous de cette aproche? des suggestions/conseils?
  • comment puis-je libérer le vLClient (qui est un TSrvMethodClient en fait)?
  • pourquoi je ne suis pas autorisé à passer un 2ème argument à la méthode Create?

Merci.

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

Il me semble que vous êtes/chemin/sur le contrôle de ce - pourquoi ne pas simplement appeler la méthode serveur directement? Essayez-vous d'écrire une fonction générale pour appeler des méthodes serveur spécifiques? –

+0

Oui, c'est exactement ce que j'essaie d'écrire, une fonction générale pour appeler des méthodes serveur spécifiques. J'ai plusieurs (disons 30) méthodes de serveur qui retournent des DataSets, donc au lieu d'avoir 30 méthodes clientes, je serai mieux (et facile à modifier) ​​pour avoir juste une méthode client. –

Répondre

1

Vous ne dupliquez pas la façon dont Datasnap appelle les méthodes distantes? Regardez par exemple « Appel de méthodes de serveur en utilisant le composant TSqlServerMethod »

+0

Je ne vois pas où est la duplication, s'il vous plaît lire mon premier commentaire sur le message original, comme réponse pour Nick Hodges. –

+0

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

Questions connexes