OLEVARIANT——这个COM的序列格式,也是DATASNAP已使用了20年的序列格式,
在20年以后的今天,终于有了它的替代者:FIREDAC的TFDJSONDataSets和TFDJSONDeltas,XE5 UPDATE2以上版本的DATASNAP的远程方法定义里面已经增加了这2种类型的支持。
FIREDAC的TFDCONNECTION尚没有“GENERATE DATASNAP CLIENT CLASSES”的项,感觉不方便,笔者测试的时候使用TSQLCONNECTION生成的客户端代理类,
易博龙稍后是否会提供?不得而知。
TFDJSONDataSets:数据集对象列表,可包含N个数据集对象,不论是单表查询或多表查询(主从表)的数据都用这种类型返回给客户端。
TFDJSONDeltas:客户端数据集的DELTA列表,可包含N个DELTA,不论是单表提交或多表提交(主从表)的数据都用这种类型提交给服务端。
为什么要有替代品?
DATASNAP为了完全去除对COM的依存,为了能跨平台。
替代者的性能是否强于OLEVARIANT?
笔者未作测试对比,不敢断言。
下面分别给出服务端和客户端的演示代码。 一)服务器端代码演示
1)常量定义:
const
sDepartment = 'Department';
sEmployees = 'Employees';

2)查询数据:

function TServerMethods1.GetDepartmentEmployees(const AID: string): TFDJSONDataSets;
begin
// Clear active so that query will reexecute.
FDQueryDepartmentEmployees.Active := False;
FDQueryDepartment.Active := False;
FDQueryDepartment.Params[0].Value := AID;
FDQueryDepartmentEmployees.Params[0].Value := AID;
 
// Create dataset list
Result := TFDJSONDataSets.Create;
// Add departments dataset
TFDJSONDataSetsWriter.ListAdd(Result, sDepartment, FDQueryDepartment);
// Add employees dataset
TFDJSONDataSetsWriter.ListAdd(Result, sEmployees, FDQueryDepartmentEmployees);
end;
TFDJSONDataSets,FIREDAC的数据集列表对象,可返回多个数据集。

3)提交数据:
procedure TServerMethods1.ApplyChangesDepartmentEmployees(
const ADeltaList: TFDJSONDeltas);
var
LApply: IFDJSONDeltasApplyUpdates;
begin
// Create the apply object
LApply := TFDJSONDeltasApplyUpdates.Create(ADeltaList);
// Apply the department delta
LApply.ApplyUpdates(sDepartment, FDQueryDepartment.Command);
if LApply.Errors.Count = 0 then
// If no errors, apply the employee delta
LApply.ApplyUpdates(sEmployees, FDQueryDepartmentEmployees.Command);
if LApply.Errors.Count > 0 then
// Raise an exception if any errors.
raise Exception.Create(LApply.Errors.Strings.Text);
end; 二)客户端演示代码
1)查询数据:
procedure TForm2.GetDepartmentEmployees(const ADEPTNO: string);
var
LDataSetList: TFDJSONDataSets;
LDataSet: TFDDataSet;
begin
LDataSetList := ClientModule1.ServerMethods1Client.GetDepartmentEmployees(ADEPTNO);
// Get department dataset
LDataSet := TFDJSONDataSetsReader.GetListValueByName(LDataSetList,sDepartment);
// Update UI
FDMemTableDepartment.Active := False;
FDMemTableDepartment.AppendData(LDataSet);
 
// Get employees dataset
LDataSet := TFDJSONDataSetsReader.GetListValueByName(LDataSetList, sEmployees);
// Update UI
FDMemTableEmployee.Active := False;
FDMemTableEmployee.AppendData(LDataSet);
end;
2)提交数据:
function TForm2.GetDeltas: TFDJSONDeltas;
begin
// Post if editing
if FDMemTableDepartment.State in dsEditModes then
begin
FDMemTableDepartment.Post;
end;
 
if FDMemTableEmployee.State in dsEditModes then
begin
FDMemTableEmployee.Post;
end;
 
// Create a delta list
Result := TFDJSONDeltas.Create;
// Add deltas
TFDJSONDeltasWriter.ListAdd(Result, sEmployees, FDMemTableEmployee);
TFDJSONDeltasWriter.ListAdd(Result, sDepartment, FDMemTableDepartment);
end;
procedure TForm2.ApplyUpdates;
var
LDeltaList: TFDJSONDeltas;
begin
LDeltaList := GetDeltas;
 
// Call server method. Pass the delta list.
ClientModule1.ServerMethods1Client.ApplyChangesDepartmentEmployees(LDeltaList);
 
end; 注意:
服务端和客户端都要放置2个控件:
TFDStanStorageJSONLink
 TFDStanStorageBinLink

 
 

OLEVARIANT的替代——FIREDAC的TFDJSONDataSets和TFDJSONDeltas的更多相关文章

  1. FIREDAC的TFDJSONDataSets和TFDJSONDeltas查询和提交数据

    服务端代码: uses Data.FireDACJSONReflect, FireDAC.Stan.Storage, FireDAC.Stan.StorageBin, FireDAC.Stan.Sto ...

  2. DATASNAP数据序列之FIREDAC的TFDJSONDataSets

    DATASNAP数据序列之FIREDAC的TFDJSONDataSets DELPHI XE5开始增加了新的数据引擎——FIREDAC,它是跨平台的数据引擎,WINDOWS.LINUX.MAC.APP ...

  3. DATASNAP数据提交之FIREDAC的TFDJSONDeltas

    DATASNAP数据提交之FIREDAC的TFDJSONDeltas FIREDAC的TFDJSONDeltas相当于CLIENTDATASET的DELTA,是作为CLIENTDATASET.DELT ...

  4. 论DATASNAP结合FIREDAC的使用方法

    论DATASNAP结合FIREDAC的使用方法 自DELPHI XE5开始引入FIREDAC数据引擎以来,FIREDAC就正式成为了官方的数据引擎.一直到XE10.1 UPDATE1,据笔者观察,FI ...

  5. DATASNAP为支持FIREDAC而增加的远程方法的数据类型TFDJSONDataSets

    前面的博客提到用FIREDAC全面替代COM那一套东西:DATAPROVIDER,OLEVARIANT,CLIENTDATASET,DBEXPRESS... 显然,DATASNAP的远程方法必须增加对 ...

  6. DataSnap 多层返回数据集分析FireDAC JSON

    采用服务器返回数据,一种是返回字符串数据例如JSON,跨平台跨语言,任何语言调用都支持兼容,类似WEBService. 第二种是紧密结合c++builder语言,传输DataSet,可以是Client ...

  7. DataSnap与FireDAC三层

    相交资料: http://blog.csdn.net/shuaihj/article/details/6129131http://www.cnblogs.com/hnxxcxg/p/4007876.h ...

  8. FireDAC探索 (二)

    又花时间试了试FireDAC,本想找到一些办法,让FireDAC取数据能和DBX样快,最终还是失败了,DBX实现是太快了,3472第记录(110个字段的表),0毫秒就抓过来了, FireDAC最快也要 ...

  9. FireDac 组件说明一

    TFDManager 连接定义和Connect连接管理  TFDConnection 数据库连接组件,支持三种连接方式:1.持久定义(有一个唯一名称和一个配置文件,可以由FDManager管理) 例: ...

随机推荐

  1. Android手机拍照

    参考的这个视频教程:http://v.youku.com/v_show/id_XNjI5MzkzMjQ4.html和官方API档file:///D:/Android/androidstudio/sdk ...

  2. 使用stringstream时的清空操作

    在C++中可以使用stringstream来很方便的进行类型转换,字符串串接,不过注意重复使用同一个stringstream对象时要先继续清空,而清空很容易想到是clear方法,而在stringstr ...

  3. int和integer;Math.round(11.5)和Math.round(-11.5)

    int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...

  4. BZOJ_1025_[SHOI2009]_游戏_(素数表+最小公倍数+DP)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1025 分析 对于\(n\),转一圈回来之后其实是好几个环各转了整数圈.这些环中的数为\(1,2 ...

  5. 自定义View,圆形头像

    1. 效果图 2. xml中 <com.etoury.etoury.ui.view.CircleImg android:id="@+id/user_info_head_img" ...

  6. Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 53

    项目问题解析“Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 53.”这个问题是最近调试app的时 ...

  7. 最简单的视音频播放示例2:GDI播放YUV, RGB

    前一篇文章对“Simplest Media Play”工程作了概括性介绍.后续几篇文章打算详细介绍每个子工程中的几种技术.在记录Direct3D,OpenGL这两种相对复杂的技术之前,打算先记录一种和 ...

  8. TS 流解码过程

    TS 流解码过程: 1. 获取TS中的PAT 2. 获取TS中的PMT 3. 根据PMT可以知道当前网络中传输的视频(音频)类型(H264),相应的PID,PCR的PID等信息. 4. 设置demux ...

  9. 【RMQ问题】求数组区间最大值,NYOJ-1185-最大最小值

    转自:http://blog.csdn.net/lilongherolilong/article/details/6624390 先挖好坑,明天该去郑轻找虐 RMQ(Range Minimum/Max ...

  10. 【转】iOS 通过xib自定义UITableViewCell【原创】

    原文网址:http://blog.it985.com/9683.html 在使用tableView的时候,如果cell的布局过于复杂,通过代码搭建的话不够直观.并且要不停的调整位置,字体什么的.这时, ...