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

论DATASNAP远程方法支持自定义对象作参数的更多相关文章

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

    有同仁需要远程方法传输自定义的数据类型,他以为要自己写代码会很复杂,其实DATASNAP早就为我们想到了. datasnap的数据序列和还原真是无与伦比的强大,其远程方法支持自定义对象传参,DATAS ...

  2. Android开发 AIDL使用自定义对象作参数或返回值

    http://www.pocketdigi.com/20121129/952.html 默认,AIDL支持对象作参数,但需要该对象实现Parcelable接口,且aidl文件应该是该类在同一包下,需要 ...

  3. 解决DATASNAP远程方法参数超过32个的问题

    群里有位同仁提出他有一个DATASNAP远程方法超过了32个参数,然后DELPHI编译通不过,提示方法参数不能超过32个,问怎么办?于是群内同仁纷纷出主意,我说用OLEVARINAT数组,有人说用RE ...

  4. DATASNAP远程方法返回TSTREAM正解(转咏南兄)

    DATASNAP远程方法返回TSTREAM正解 DATASNAP远程方法返回TSTREAM,如果数据大小超过32K是会报错的.许多DELPHIER栽在这个上头,甚至开始怀疑TSTREAM返回数据的可行 ...

  5. DATASNAP远程方法返回TSTREAM正解

    DATASNAP远程方法返回TSTREAM正解 DATASNAP远程方法返回TSTREAM,如果数据大小超过32K是会报错的.许多DELPHIER栽在这个上头,甚至开始怀疑TSTREAM返回数据的可行 ...

  6. Android JNI 自定义对象为参数和返回值

    ndroid JNI 提供了很强大的支持,不仅可以采用基本类型做为参数和返回值,同时也支持自定义对象做为参数和返回值,以下举例说明. 一.定义作为输入和返回的自定义类 (仅提供两个简单类型和一个打印函 ...

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

    在提取局部表结构数据时,通过Select选取需要的字段,如下句,此时其实产生了一个不用于_menuMan的原新数据类型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITL ...

  8. 自定义Func方法支持out,ref参数

    默认的Func不支持Out,ref类型的参数,所以需要自定义个delegate func来满足需求.具体代码如下 public delegate TResult FuncEX<T1, T2, T ...

  9. NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象

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

随机推荐

  1. (转)js弹窗&返回值(window.open方式)

    本文转载自:http://hi.baidu.com/z57354658/item/5d5e26b8e9f42fa7ebba93d4 js弹窗&返回值(window.open方式) test.h ...

  2. Java renameTo()重新命名此抽象路径名表示的文件

    Java手册 renameTo public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件. 此方法行为的许多方面都是与平台有关的:重命名操作无法将一个文件从 ...

  3. 微信小程序从子页面退回父页面时的数据传递 wx.navigateBack()

    我们知道,在微信小程序中,从一个页面转到另一个页面,一般情况下可以通过navigate或redirect时候的url来携带参数,然后在目标页面的onLoad函数参数中获取这些url参数.例如: // ...

  4. 获取文件夹总大小方法2_获取cmd命令结果,效率最高

    public static long GetDirectorySize(string path) { long res = 0; System.Diagnostics.Process p = new ...

  5. delphi 实体类 JSON 数组

    delphi 实体类 与JSON转换,序列化 TJson REST.JSON.pas   TJson.JsonToObjectTJson.ObjectToJsonString JsonEncode O ...

  6. Ubuntu12.04编译vlc-android详细流程

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  7. android处理Back键Home键和Menu键事件(转)

    @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BAC ...

  8. java.io.FileNotFoundException(系统找不到指定的路径。)

    报错:java.io.FileNotFoundException(系统找不到指定的路径.) 解决方法: 1.检查文件路径是否正确 2.另外,使用OutputStream时,如果文件不存在,会自动创建文 ...

  9. leetcode 20 Valid Parentheses 有效的括号

    描述: 给定一些列括号,判断其有效性,即左括号有对应的有括号,括号种类只为小,中,大括号. 解决: 用栈. bool isValid(string s) { stack<char> st; ...

  10. redis的连接方法|连接池|操作

    1.先看下redis的连接 import redis # 连接服务端 r = redis.Redis(host="127.0.0.1",port=6379) #获取所有的key值 ...