OLEVARIANT的替代——FIREDAC的TFDJSONDataSets和TFDJSONDeltas

本文介绍DATASNAP中OLEVARIANT的替代方案TFDJSONDataSets和TFDJSONDeltas,详细展示了这两种新序列格式在服务端和客户端的应用示例,并解释了其引入背景及目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值