论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;

转载于:https://www.cnblogs.com/hnxxcxg/p/6201668.html

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

  1. OpenCV DNN支持的对象检测模型

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 引言 OpenCV DNN不光支持图像 ...

  2. iOS NSUserDefaults 简介 NSUserDefaults 存储自定义对象

    摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是 ...

  3. iOS-NSUserDefaults缓存自定义对象

    转载自:http://my.oschina.net/u/1245365/blog/294449 转载请保留原地址 摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSStr ...

  4. html js添加随机数,js随机数(支持自定义范围)

    js随机数牵扯到的javascript的Math对象,Math提供对数据的数学计算,在随机数中常用的Math对象如下: 1.Math.random(); 结果为0-1间的一个随机数(包括0,不包括1) ...

  5. 判断java中String、自定义对象、集合为空的方法

    一.仅判断是否分配内存 如果仅判断该对象.集合是否已被分配内存(即null还是非null),而不用考虑是否有值,则直接使用 object == null判断即可. 二.如果需进一步判断 要进一步判断该 ...

  6. JS 创建自定义对象的方法

    工厂模式 优点:接受参数,可以无数次的调用这个函数,创建Person对象,而每次他都可以返回一个包含三个属性一个方法的对象. 缺点:虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题(即怎么 ...

  7. C++自定义对象如何支持Range-based循环语法

    自定义对象如何支持Range-based循环语法 至少实现以下两种语法: //返回第一个迭代子的位置 Iterator begin() //返回最后一个迭代子的下一个位置 Iterator end() ...

  8. HashMap存自定义对象为什么要重写 hashcode 和 equals 方法?

    HashMap的k放过自定义对象么? 当我们把自定义对象存入HashMap中时,如果不重写hashcode和equals这两个方法,会得不到预期的结果. class Key{private Integ ...

  9. [置顶] 深入浅出Javascript(三)创建自定义对象以及属性、方法

    怎么样创建一个对象? 利用Object创建自定义对象 JavaScript能够自定义对象来扩展程序的功能,不仅如此,它还能扩展JavaScript提供的内置对象,新增内置对象的属性或方法 例如下面代码 ...

最新文章

  1. vfp语言第 代计算机语言,VFP语言属于第()代计算机语言。A、一B、二C、三D、四...
  2. javascript黑魔法
  3. 计算机科学与应用论文的素材,计算机专业学位论文范文最新资料汇集
  4. cors跨域_跨域,不止CORS
  5. Socket网络编程--小小网盘程序(5)
  6. 32--数组中重复的数字
  7. 2.4 shell 脚本基础
  8. [Swift]LeetCode1051.高度检查器 | Height Checker
  9. “阿里味” PUA 编程语言火上GitHub热榜,标星1.9K!
  10. 一个网站图标引发的血案!绕过同源策略,判断你是否登录了某网站
  11. Android自动播放下一曲,环信Android自动播放下一条语音
  12. cpda数据分析师证书含金量高吗
  13. python词云图实例
  14. c语言自我介绍范文,个性的自我介绍范文5篇
  15. 会声会影2018 转码导出H.265/HEVC编码视频
  16. 吐血推荐珍藏的Visual Studio Code插件
  17. java实现加权随机,负载均衡--加权随机算法(Weight Random)
  18. [原创]中国大陆民谣盘点8 曹崴《情歌唱晚》
  19. ◮OpenGL-混合
  20. 先电IAAS V2.2(2017版)平台搭建手册---脚本搭建

热门文章

  1. matlab colorbar采用对数,matlab colorbar的使用 | 學步園
  2. android sdk 2.9.5.0,如何找到问题Android SDK 3.0错误:(9,5)错误:资源android:attr/colorError未找到...
  3. spring事务三大接口
  4. 为什么需要StringBuffer
  5. 设计模式:迪米特原则
  6. 安卓linux交叉编译,Linux Ubuntu下用Android NDK 生成独立交叉编译链
  7. 在使用selenium,Chrome无界面浏览模式与自定义插件加载问题
  8. python 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值
  9. java数据类型及其说明
  10. 在当今移动互联网时代_谁在提供当今最好的电子邮件体验?