论DATASNAP远程方法支持自定义对象作参数

DATASNAP远程方法已经可以支持自定义对象作参数,这是非常方便的功能。

1)自定义对象

type
TMyInfo = class(TObject)
public
AccountNo: string;
SQL: string;
Params: string;
end;

2)远程方法定义

function TServerMethods1.QuerySql4(const myInfo: TMyInfo): TFDJSONDataSets;
var
d: TfrmDB;
begin
Result := nil;
if not Assigned(myInfo) then
Exit;
if (myInfo.accountNo = '') or (myInfo.sql = '') then
Exit;
d := GetDBPool(myInfo.accountNo).Lock;
if not Assigned(d) then
Exit;
try
try
SetTraceOn(d);
d.qryOpen.Close;
d.qryOpen.sql.Clear;
d.qryOpen.sql.Text := myInfo.sql;
if myInfo.params <> '' then
StrToFDParams(myInfo.params, d.qryOpen.params);
d.qryOpen.Open;
Result := TFDJSONDataSets.Create;
TFDJSONDataSetsWriter.ListAdd(Result, '1', d.qryOpen);
except
on e: Exception do
begin
Result := nil;
Log.WriteLog('TServerMethods1.QuerySql4 ' + e.Message);
end;
end;
finally
d.qryOpen.Close;
GetDBPool(myInfo.accountNo).Unlock(d);
SetTraceOff(d);
end;
end;

3)客户端自动生成的远程方法接口

function TServerMethods1Client.QuerySql4(myInfo: TMyInfo): TFDJSONDataSets;
begin
if FQuerySql4Command = nil then
begin
FQuerySql4Command := FDBXConnection.CreateCommand;
FQuerySql4Command.CommandType := TDBXCommandTypes.DSServerMethod;
FQuerySql4Command.Text := 'TServerMethods1.QuerySql4';
FQuerySql4Command.Prepare;
end;
if not Assigned(myInfo) then
FQuerySql4Command.Parameters[0].Value.SetNull
else
begin
FMarshal := TDBXClientCommand(FQuerySql4Command.Parameters[0].ConnectionHandler).GetJSONMarshaler;
try
FQuerySql4Command.Parameters[0].Value.SetJSONValue(FMarshal.Marshal(myInfo), True);
if FInstanceOwner then
myInfo.Free
finally
FreeAndNil(FMarshal)
end
end;
FQuerySql4Command.ExecuteUpdate;
if not FQuerySql4Command.Parameters[1].Value.IsNull then
begin
FUnMarshal := TDBXClientCommand(FQuerySql4Command.Parameters[1].ConnectionHandler).GetJSONUnMarshaler;
try
Result := TFDJSONDataSets(FUnMarshal.UnMarshal(FQuerySql4Command.Parameters[1].Value.GetJSONValue(True)));
if FInstanceOwner then
FQuerySql4Command.FreeOnExecute(Result);
finally
FreeAndNil(FUnMarshal)
end
end
else
Result := nil;
end;

从代码中可以看出,DATASNAP自动将我们的自定义对象使用JSON序列和还原了。

4)客户端调用演示

procedure TForm1.Button3Click(Sender: TObject);
var
LDataSets: TFDJSONDataSets;
LDataSet: TFDDataSet;
myInfo: TMyInfo;
begin
DataSource1.DataSet := FDMemTable1;
myInfo := TMyInfo.Create;
myInfo.AccountNo := '0';
myInfo.SQL := 'select * from t1 where c1=:c1';
myInfo.params := 'c1:55';
LDataSets := methods.QuerySql4(myInfo);
LDataSet := TFDJSONDataSetsReader.GetListValueByName(LDataSets, '1');
FDMemTable1.Close;
FDMemTable1.Data := LDataSet;
end;

最新文章

  1. php伪静态--隐藏地址实际路径方法
  2. 神经网络与深度学习(3):Backpropagation算法
  3. [Android Pro] 完美Android Cursor使用例子(Android数据库操作)
  4. LinuxMint 18 编译cm13.0 笔记
  5. 3. javacript高级程序设计-基本概念
  6. C语言 对称矩阵 压缩 实现
  7. 025医疗项目-模块二:药品目录的导入导出-HSSF导入类的封装
  8. osgEarth编译的一些问题
  9. spring注入参数详解
  10. .NET下的延迟加载
  11. [转] FDA批准首个莫米松植入式给药系统用于治疗慢性鼻窦炎
  12. 【转】 iOS如何实现表格的折叠效果?
  13. 删除Lb重复的数,用La输出(顺序表)
  14. ZBUS = MQ + RPC
  15. Oracle listener服务启动后又停止的解决方案
  16. php第三方类库定时任务
  17. JDBC (二)
  18. Go-常用库的介绍
  19. 橙色优学:Java编程怎么提升技术,Java编程思维至关重要
  20. 一篇 SpringData+JPA 总结

热门文章

  1. 腾讯互娱开源分布式开发框架Pebble
  2. Linux C 一些函数 所属头文件
  3. Fiddler 抓包工具总结-bpafter
  4. 0908期 HTML Frameset框架和选择器
  5. Autofac Property Injection and Method Injection
  6. 常见的JS和CSS问题
  7. SQL Server实时同步更新远程数据库遇到的问题
  8. python的多线程编程之锁
  9. NSString 与C++ string字符串的互转(转)
  10. 小学生作业V2.0