OLEVARIANT的替代——FIREDAC的TFDJSONDataSets和TFDJSONDeltas


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


 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM