变量定义:

var
FDConnection: TFDConnection;
qCustomers: TFDQuery;
qOrders: TFDQuery;
FDSchemaAdapter: TFDSchemaAdapter;
FDStanStorageBinLink1: TFDStanStorageBinLink;
。。。

服务端查询方法:

TFDSchemaAdapter可以将多个关联的FIREDAC数据集(比如TFDQuery)序列为TSTREAM,当然适用于序列主从表数据。

function TServerMethods.StreamGet: TStream;
begin
Result := TMemoryStream.Create;
// 主表
qCustomers.Connection := FDConnection;
qCustomers.SchemaAdapter := FDSchemaAdapter;
qCustomers.Close;
qCustomers.SQL.Clear;
qCustomers.SQL.Text := 'select * from t1';
qCustomers.Open;

// 从表
qOrders.Connection := FDConnection;
qOrders.SchemaAdapter := FDSchemaAdapter;
// 设置主从关系
qOrders.MasterSource := dsCustomers;
qOrders.MasterFields := 'CustomerID';
qOrders.Close;
qOrders.SQL.Clear;
qOrders.SQL.Text := 'select * from t2';
qOrders.Open;
// 将数据以二进制方式保存成流,FIREDAC数据以BIN格式序列,体积最小,网络传输最快。
FDSchemaAdapter.SaveToStream(Result, TFDStorageFormat.sfBinary);
Result.Position := 0;
end;

服务端提交数据方法:

function TServerMethods.StreamPost(AStream: TStream): Boolean;
var
LMemStream: TMemoryStream;
LErrors: Integer;
begin
LMemStream := CopyStream(AStream);
LMemStream.Position := 0;
try
FDSchemaAdapter.LoadFromStream(LMemStream, TFDStorageFormat.sfBinary);
LErrors := FDSchemaAdapter.ApplyUpdates
finally
LMemStream.Free;
Result := LErrors > 0;
end;
end;

客户端

var

mtCustomers: TFDMemTable;
taCustomers: TFDTableAdapter;
dsCustomers: TDataSource;
mtOrders: TFDMemTable;
FDSchemaAdapter: TFDSchemaAdapter;
taOrders: TFDTableAdapter;

FDStanStorageBinLink1: TFDStanStorageBinLink;

FDStoredProcGet: TFDStoredProc;
FDStoredProcPost: TFDStoredProc;

。。。

// 主表
taCustomers.SchemaAdapter := FDSchemaAdapter;
taCustomers.DatSTableName := 'qCustomers';
mtCustomers.Adapter := taCustomers;

// 从表
taOrders.SchemaAdapter := FDSchemaAdapter;
taOrders.DatSTableName := 'qOrders';
mtOrders.Adapter := taOrders;
mtOrders.MasterSource := dsCustomers;
mtOrders.MasterFields := 'CustomerID';

。。。

FDStoredProcGet.Connection := FDConnection1;
FDStoredProcGet.StoredProcName := 'TServerMethods.StreamGet';
FDStoredProcGet.Params.CreateParam(ftBlob, 'ReturnValue', ptResult);
FDStoredProcPost.Connection := FDConnection1;
FDStoredProcPost.StoredProcName := 'TServerMethods.StreamPost';
FDStoredProcPost.Params.CreateParam(ftStream, 'AStream', ptInput);

。。。

//客户端查询数据方法

procedure TClientForm.GetTables;
var
LStringStream: TStringStream;
begin
FDStoredProcGet.ExecProc;
LStringStream := TStringStream.Create(FDStoredProcGet.Params[0].asBlob);
try
if LStringStream <> nil then
begin
LStringStream.Position := 0;
DataModuleFDClient.FDSchemaAdapter.LoadFromStream(LStringStream, TFDStorageFormat.sfBinary);
end;
finally
LStringStream.Free;
end;
end;

//客户端提交数据方法

procedure TClientForm.PostTables;
var
LMemStream: TMemoryStream;
I: integer;
LDataSet: TDataSet;
begin
for I := 0 to DataModuleFDClient.FDSchemaAdapter.Count - 1 do
begin
LDataSet := DataModuleFDClient.FDSchemaAdapter.DataSets[I];
if LDataSet <> nil then
if LDataSet.State in dsEditModes then
LDataSet.Post;
end;

LMemStream := TMemoryStream.Create;
try
DataModuleFDClient.FDSchemaAdapter.ResourceOptions.StoreItems := [siDelta, siMeta];
DataModuleFDClient.FDSchemaAdapter.SaveToStream(LMemStream, TFDStorageFormat.sfBinary);
LMemStream.Position := 0;
FDStoredProcPost.Params[0].asStream:= LMemStream;
FDStoredProcPost.ExecProc;
except
On E: Exception do
raise Exception.Create(E.Message);
end;
end;

DATASNAP高效的FIREDAC数据序列和还原的更多相关文章

  1. msgpack的数据序列和还原

    msgpack的数据序列和还原 msgpack不仅可以序列一些常规的数据类型的数据,比如:string.datetime.integer...... 还能序列olevariant.stream 这就非 ...

  2. 优秀的数据序列和还原类----TSimpleMsgPack

    优秀的数据序列和还原类----TSimpleMsgPack TSimpleMsgPack是D10天地弦的作品. 优点:至简,就一个单元文件实现,不需要引用其他单元. 缺点:不是标准的MSGPACK实现 ...

  3. cross socket和msgpack的数据序列和还原

    cross socket和msgpack的数据序列和还原 procedure TForm1.Button1Click(Sender: TObject); begin var pack: TSimple ...

  4. firedac的数据序列和还原单元(Data.FireDACJSONReflect.pas)之拷贝FIREDAC数据集

    使用流做中转 procedure CopyDataSet(const ASource, ADest: TFDAdaptedDataSet);var LStream: TStream;begin LSt ...

  5. DATASNAP数据序列之FIREDAC的TFDJSONDataSets

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

  6. 一个例子说明如何在DataSnap中使用FireDAC

    一.FireDAC调用DataSnap远程方法查询数据示例 1.服务端使用FDQUERY查询数据并返回TDATASET: function TServerMethods1.GetData(var sq ...

  7. 论DELPHI三层的数据序列格式的变化

    论DELPHI三层的数据序列格式的变化 要窥三层的数据序列格式,我们可以通过观察DELPHI官方的客户端内存表. 早先流行的是TClientDataSet,它的Data和Delta属性的数据类型都是: ...

  8. MSGPACK序列和还原TFDParams

    MSGPACK序列和还原TFDParams unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, S ...

  9. firedac二进制序列和JSON序列的对比

    firedac二进制序列和JSON序列的对比 以同样大小的一个数据集的数据,作为测试的数据. 以JSON序列后的数据体积是4958字节. 以二进制序列后的数据体积是3044字节. 4958/3044= ...

随机推荐

  1. 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...

  2. Element UI tree 回显问题

    Part.1 问题 写项目时遇到一个棘手的问题,在做关于权限功能时,点击修改需要显示角色原本对应的权限.涉及到了 tree 组件回显,但是有一个很尴尬的问题:tree 组件只要父节点选中,那么子节点就 ...

  3. 数据库_11_1~10总结回顾+奇怪的NULL

    校对集问题: 比较规则:_bin,_cs,_ci利用排序(order by) 另外两种登录方式: 奇怪的NULL: NULL的特殊性:

  4. Vickers Vane Pump - How To Choose Vane Pump Parameter Specifications?

    1 rated pressure selection. The rated pressure of the vane pump products is 7MPa, 1OMPa, 16MPa, 2lMP ...

  5. 日常[splay]:水题记——营业额统计

    没错这就是让我深陷splay之中的罪魁祸首,昨天打了一下午结果发现是玄学错误的那个 人生第一棵splay平衡树 题目大意:求一段序列,小于当前元素的最大值和大于当前元素的最小值.从该元素前面的元素找. ...

  6. kotlin - Parcelable implementations generator

    本文摘自——https://kotlinlang.org/docs/tutorials/android-plugin.html Android Extensions plugin provides P ...

  7. docker nginx 负载均衡

    index1.html <html> <head> <title>lb-test</title> </head> <body> ...

  8. 使用iframe引入公共模块

    新建一个公共文件head.html <!DOCTYPE html><html lang="en"><head> <meta charset ...

  9. 浅谈stiring数

    在组合数学,Stirling数可指两类数,第一类Stirling数和第二类Stirling数. stirling常应用于许多组合枚举问题中. 第一类stirling数: 对第一类Stirling数   ...

  10. 区间DP入门

    所为区间DP,主要是把一个大区间拆分成几个小区间,先求小区间的最优值,然后合并起来求大区间的最优值. 区间DP最关键的就是满足最优子结构以及无后效性!! 例如像是石子合并和括号匹配这两类比较经典的模型 ...