datasnap远程方法支持自定义对象传参

有同仁需要远程方法传输自定义的数据类型,他以为要自己写代码会很复杂,其实DATASNAP早就为我们想到了。

datasnap的数据序列和还原真是无与伦比的强大,其远程方法支持自定义对象传参,DATASNAP会自动使用JSON序列和还原自定义的对象。

1)自定义一个对象

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

2)服务端远程方法定义

function TServerMethods1.QuerySql4(const myInfo: TMyInfo): TFDJSONDataSets;
var
d: TfrmDB;
i, iPos: Integer;
sl: TStringList;
LName, LValue, LStr: string;
p: TFDParam;
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
d.qryOpen.Close;
d.qryOpen.sql.Clear;
d.qryOpen.sql.Text := myInfo.SQL;
if myInfo.Params <> ‘‘ then
begin
sl := TStringList.Create;
try
sl.Delimiter := ‘;‘;
sl.DelimitedText := myInfo.Params;
for i := 0 to sl.Count - 1 do
begin
LStr := sl.Strings[i];
iPos := Pos(‘:‘, LStr);
LName := LeftStr(LStr, iPos - 1);
LValue := RightStr(LStr, Length(LStr) - iPos);
p := d.qryOpen.FindParam(LName);
if p <> nil then
p.Value := LValue;
end;
finally
sl.Free;
end;
end;
d.qryOpen.Open;
Result := TFDJSONDataSets.Create;
TFDJSONDataSetsWriter.ListAdd(Result, ‘1‘, d.qryOpen);
except
on e: Exception do
begin
Result := nil;
Log.WriteLog(‘TServerMethods1.QuerySql2 ‘ + e.Message);
end;
end;
finally
d.qryOpen.Close;
GetDBPool(myInfo.AccountNo).Unlock(d);
end;
end;

3)客户端调用

procedure TForm1.Button3Click(Sender: TObject);
var
LDataSets: TFDJSONDataSets;
LDataSet: TFDDataSet;
myInfo: TMyInfo;
begin
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;

时间: 2024-10-12 01:08:40

datasnap远程方法支持自定义对象传参的相关文章

C#为什么不能像C/C++一样的支持函数只读传参

C#为什么不能像C/C++一样的支持函数只读传参? 这个问题其实问的人挺多的,我自己也经常想实现这个功能,但是发现总是那么的不尽人意. 有些人倒是给出了一下答案,但是都不能很好的解决像C/C++一样的支持函数只读传参这个问题. 其实这块我觉得我们可能有个误区.就是我们为什么要这样做呢?这样做的目的是什么?对了就是这个.答案也在这里面.关键就在这目的上.我们用C/C++可能有 function(Data const * const pcData),但是在C#里面没有了.感觉似乎少了点什么.对就是少

js date对象传参获取特定日期的时间戳

当我们想要通过js获取某一特定时间的时间戳时,会通过给date对象传参再通过getTime函数来获取,传递的参数格式也有不同形式.有些时候,可能会因为自己传入参数的格式不正确而导致date对象invalid,进而导致逻辑出现错误. date对象传递的参数主要有字符串以及年月日等的数字,如下: new Date( year, month, date, hrs, min, sec) 参数说明: year的值为:需设定的年份-1900.例如需设定的年份是1997则year的值应为97,即1997-19

c++代码赏析之类对象传参

#include <iostream> using namespace std; class A { private: int x; public: A():x(0) { x = 0; cout << "construct" << endl; } A(const A &a) { x = a.x; cout << "construct copy" << endl; } ~A(){ cout <&

dynamic结合匿名类型 匿名对象传参

首先说明下,我一般很少用dynamic关键字(类)的,因为毕竟是由反射实现的,所以对于性能方面还是吃亏不少(注:由于心里没底,查了一些资料得知,dynamic实质上好像不是由反射实现的,其性能也比直接反射要高不少,至于为什么,我也不明白,希望你们知道的能留言告诉我一下!谢谢啦 ^_^)我也不知道为什么DLR能够实现与反射一样的实现,但代码,性能要比后者简介,高效!! 我这里就纯粹在这里坐下记录 匿名对象(类型)传参的几种方式 代码如下: class Program { static void M

(远程方法的调用)对象序列化、反射在网络编程的运用

对象的序列化与反序列化[p213页]当两个进程进行远程通信时,彼此可以发送各种类型的数据,如文本.图 片.语音和视频等.无论不纯二进制序列的形式在网络上传送.当两个 java进程进行远程通信时,一个进程把一个java对象发送到另一个进程 中.不过发送方需要把这个java对象转换为字节序列,才能在网络上传 送:接收方则需要把自己序列在恢复为java对象.把java对象转换为字 节序列的过程称为对象序列化:把字节序列恢复为java对象的过程称为 对象称为对象的反序列化.JDK类库中的序列化APIja

expect脚本远程登录、远程执行命令和脚本传参简单用法

expect介绍: 最近想写一个自动化安装脚本,涉及到远程登录.分发文件包.远程执行命令等,其中少不了来回输入登录密码,交互式输入命令等,这样就大大降低了效率,那么有什么方法能解决呢?不妨试试expect: expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet. expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间. 远程登录lin

Java自学-类和对象 传参

Java中的传参 变量有两种类型 基本类型 和类类型 参数也是变量,所以传参分为 基本类型传参 类类型传参 步骤 1 : 基本类型传参 基本类型传参 在方法内,无法修改方法外的基本类型参数 public class Hero { String name; //姓名 float hp; //血量 float armor; //护甲 int moveSpeed; //移动速度 public Hero(){ } //回血 public void huixue(int xp){ hp = hp + xp

匿名类型与Select方法实现自定义对象插入局部表结构中

在提取局部表结构数据时,通过Select选取需要的字段,如下句,此时其实产生了一个不用于_menuMan的原新数据类型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITLE },这样的类型就叫匿名类型 var comdList = _menuMan.Load(c => c.FATHER_ID == null).OrderBy(c=>c.VAL_DISPLAYORDERID).Select(c=>new { c.SYS_COMMANDS_ID,c.TXT_CO

在使用MVC对象传参的心得

1.在我做分页的时候遇到了一个这样的问题 做个像百度那样的分页.当我在对象传递参数的时候死活参不过去..在controller那里始终没办法是对pager.这个对象的前缀 在经过资料的阅读查看后发现要定义一个对象前缀的识别(pager.)这样在controller里面的对象就能够接收到. 2.在做jQuery Validation注册验证的时候 密码之间的比较是 用上一个密码的ID进行内容值的比较