变量定义:

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. H3C S5024P交换机 H3C AR28-31路由器命令

    H3C S5024P交换机 H3C AR28-31路由器命令 交换机命令 各个视图的切换: 注意命令要在相应的视图下执行 在用户视图下键入quit命令可以断开与交换机的连接.在其它视图中键入quit命 ...

  2. jmeter 接口测试简介

    前言: 本文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对 ...

  3. zabbix实现自动发现功能添加磁盘监控

    zabbix实现对磁盘动态监控 - Lenwood 原文  http://www.cnblogs.com/baizhantang/p/3253246.html 主题 Linux命令 zabbix 前言 ...

  4. C++派生类继承父类修饰符

    公式: 继承成员对外的访问属性 = Max{继承方式,父类成员访问级别}: 1.如果子类从父类继承时使用的继承限定符是public,那么(1)父类的public成员成为子类的public成员,允许类以 ...

  5. spring注解开发-AOP(含原理)

    一:AOP基本使用 AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 步骤一:导入aop模块:Spring AOP:(spring-aspects) <depen ...

  6. luogu P2734 游戏 A Game

    https://www.luogu.org/problemnew/show/P2734 数据范围比较小,二位DP可做,而luogu 3004,虽然几乎一模一样(只是数据范围大点),则需要压维. 定义f ...

  7. 计算机网络之传输层 下(TCP)

    1. TCP的特点 特点:它是一个点到点的通信机制,只能有一个发送方和一个接收方:它提供是一个可靠的,按序的字节流机制:使用流水线机制,通过拥塞控制和流量控制的机制设置窗口尺寸:发送方和接收方都有缓存 ...

  8. AT2663 Namori Grundy

    题目描述: luogu 题解: 好多细节,比如说每个点有且仅有一条入边. 所以说这个图一定是一个基环外向树. 考虑只是一个环的情况,我们可以发现,当环长为偶数时我们可以$01$交替染色,但环长为奇数时 ...

  9. 网络设置命令--ifconfig.setup

    ifconfig命令 作用:用于显示以及设置当前活动网卡信息 一.  显示当前活动网卡信息 ifconfig 从上面可以看到当前主要有2块活动网卡,eth0:代表当前本地真实网卡 lo:代表回访网卡, ...

  10. MySQL redo log 与 binlog 的区别

    MySQL redo log 与 binlog 的区别 什么是redo log 什么是binlog redo log与binlog的区别 1. 什么是redo log? redo log又称重做日志文 ...