Sur DATASNAP, la méthode distante prend en charge les objets personnalisés en tant que paramètres
Les méthodes distantes DATASNAP peuvent déjà prendre en charge des objets personnalisés en tant que paramètres, ce qui constitue une fonctionnalité très pratique.
1) Objets personnalisés
tapez
TMyInfo = class(TObject)
public
AccountNo: string;
SQL : chaîne ;
Paramètres : chaîne ;
fin;
2) Définition de la méthode à distance
fonction TServerMethods1.QuerySql4(const myInfo : TMyInfo) : TFDJSONDataSets ;
var
d : TfrmDB ;
début
Résultat := nul ;
si ce n'est pas attribué (myInfo), alors
quittez ;
if (myInfo.accountNo = '') ou (myInfo.sql = '') then
Quitter ;
d := GetDBPool(myInfo.accountNo).Lock;
s'il n'est pas affecté (d), alors
quittez ;
essayez
, essayez
SetTraceOn(d);
d.qryOpen.Close;
d.qryOpen.sql.Clear;
d.qryOpen.sql.Text := monInfo.sql;
si myInfo.params <> '' alors
StrToFDParams(myInfo.params, d.qryOpen.params);
d.qryOpen.Open;
Résultat := TFDJSONDataSets.Create;
TFDJSONDataSetsWriter.ListAdd(Result, '1', d.qryOpen);
sauf
sur e : Exception do
start
Résultat := nul;
Log.WriteLog('TServerMethods1.QuerySql4 ' + e.Message);
fin;
fin;
enfin
d.qryOpen.Close ;
GetDBPool(myInfo.accountNo).Unlock(d);
SetTraceOff(d);
fin;
fin;
3) Interface de méthode distante générée automatiquement par le client
fonction TServerMethods1Client.QuerySql4(myInfo : TMyInfo) : TFDJSONDataSets ;
commencez
si FQuerySql4Command = nil alors
commencez
FQuerySql4Command := FDBXConnection.CreateCommand;
FQuerySql4Command.CommandType := TDBXCommandTypes.DSServerMethod;
FQuerySql4Command.Text := 'TServerMethods1.QuerySql4';
FQuerySql4Command.Prepare ;
fin;
sinon Assigned(myInfo) alors
FQuerySql4Command.Parameters[0].Value.SetNull
sinon
commencez
FMarshal := TDBXClientCommand(FQuerySql4Command.Parameters[0].ConnectionHandler).GetJSONMarshaler;
essayez
FQuerySql4Command.Parameters[0].Value.SetJSONValue(FMarshal.Marshal(myInfo), True);
si FInstanceOwner alors
myInfo.Free
enfin
FreeAndNil(FMarshal)
end
end ;
FQuerySql4Command.ExecuteUpdate ;
sinon FQuerySql4Command.Parameters[1].Value.IsNull alors
commencez
FUnMarshal := TDBXClientCommand(FQuerySql4Command.Parameters[1].ConnectionHandler).GetJSONUnMarshaler;
essayez
Résultat := TFDJSONDataSets(FUnMarshal.UnMarshal(FQuerySql4Command.Parameters[1].Value.GetJSONValue(True)));
si FInstanceOwner alors
FQuerySql4Command.FreeOnExecute(Result);
enfin
FreeAndNil(FUnMarshal)
end
end
else
Résultat := nil;
fin;
Comme le montre le code, DATASNAP sérialise et restaure automatiquement nos objets personnalisés à l'aide de JSON.
4) Démonstration d'appel client
procédure TForm1.Button3Click(Expéditeur : TObject);
var
LDataSets : TFDJSONDataSets ;
LDataSet : TFDDataSet ;
monInfo : TMonInfo ;
commencer
DataSource1.DataSet := FDMemTable1;
monInfo := TMyInfo.Create;
monInfo.AccountNo := '0';
myInfo.SQL := 'select * from t1 où c1=:c1';
monInfo.params := 'c1:55';
LDataSets := méthodes.QuerySql4(myInfo);
LDataSet := TFDJSONDataSetsReader.GetListValueByName(LDataSets, '1');
FDMemTable1.Fermer ;
FDMemTable1.Data := LDataSet;
fin;