DATASNAP高效的FIREDAC数据序列和还原
变量定义:
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数据序列和还原的更多相关文章
- msgpack的数据序列和还原
msgpack的数据序列和还原 msgpack不仅可以序列一些常规的数据类型的数据,比如:string.datetime.integer...... 还能序列olevariant.stream 这就非 ...
- 优秀的数据序列和还原类----TSimpleMsgPack
优秀的数据序列和还原类----TSimpleMsgPack TSimpleMsgPack是D10天地弦的作品. 优点:至简,就一个单元文件实现,不需要引用其他单元. 缺点:不是标准的MSGPACK实现 ...
- cross socket和msgpack的数据序列和还原
cross socket和msgpack的数据序列和还原 procedure TForm1.Button1Click(Sender: TObject); begin var pack: TSimple ...
- firedac的数据序列和还原单元(Data.FireDACJSONReflect.pas)之拷贝FIREDAC数据集
使用流做中转 procedure CopyDataSet(const ASource, ADest: TFDAdaptedDataSet);var LStream: TStream;begin LSt ...
- DATASNAP数据序列之FIREDAC的TFDJSONDataSets
DATASNAP数据序列之FIREDAC的TFDJSONDataSets DELPHI XE5开始增加了新的数据引擎——FIREDAC,它是跨平台的数据引擎,WINDOWS.LINUX.MAC.APP ...
- 一个例子说明如何在DataSnap中使用FireDAC
一.FireDAC调用DataSnap远程方法查询数据示例 1.服务端使用FDQUERY查询数据并返回TDATASET: function TServerMethods1.GetData(var sq ...
- 论DELPHI三层的数据序列格式的变化
论DELPHI三层的数据序列格式的变化 要窥三层的数据序列格式,我们可以通过观察DELPHI官方的客户端内存表. 早先流行的是TClientDataSet,它的Data和Delta属性的数据类型都是: ...
- MSGPACK序列和还原TFDParams
MSGPACK序列和还原TFDParams unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, S ...
- firedac二进制序列和JSON序列的对比
firedac二进制序列和JSON序列的对比 以同样大小的一个数据集的数据,作为测试的数据. 以JSON序列后的数据体积是4958字节. 以二进制序列后的数据体积是3044字节. 4958/3044= ...
随机推荐
- Linux centos7开机界面出现多个选项
centos7开机界面出现多个选项时 前面几个选项正常启动,最后一个选项急救模式启动(系统出项问题不能正常启动时使用并修复系统) 在CentOS更新后,并不会自动删除旧内核.所以在启动选项中会有多个内 ...
- echo - 显示一行文本
SYNOPSIS(总览) echo[OPTION]... [STRING]... DESCRIPTION(描述) 允许在标准输出上显示STRING(s). -n 不输出行尾的换行符. -e 允许对下面 ...
- Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框(转载)
https://blog.csdn.net/evangel_z/article/details/7332535
- Docker安装Oracle12C,导入dmp文件出现ORA-12170错误
oracle版本为 sath89/oracle-12c oracle基本信息 hostname: localhost port: 1521 sid: xe username: system passw ...
- 洛谷 P2337 【[SCOI2012]喵星人的入侵】
这几天一直在刷插头Dp,写了几道入门题后,觉得还比较水,直到我发现了这一题.... 题目大意:给你一个n*m的地图,有些是空地,有些是障碍,还有两个是ST,在给你一个L,代表可以放L个炮台,你要在空地 ...
- linux wget变成000权限
今天使用wget下载文件时出现:-bash: /usr/bin/wget: 权限不够. 查看 /usr/bin/wget 的权限为: ---------- 1 root root 357400 3月 ...
- turtle安装问题
原文来源:https://blog.csdn.net/liudongdong19/article/details/81283942 本人python版本为:Python 3.6.5 在安装turtle ...
- Spring中RestTemplate的使用方法
一.REST 在互联网中,我们会通过请求url来对网络上的资源做增删改查等动作,这里的请求包含两部分:动词,主要包括增.删.改.查:名词,就是网络中的各种资源.传统的非REST风格的请求方式是把动词和 ...
- 15. PARTITIONS
15. PARTITIONS PARTITIONS表提供有关表分区的信息. 此表中的每一行对应于分区表的单个分区或子分区. 有关分区表的更多信息,请参见分区. PARTITIONS表有以下列: TAB ...
- 快速部署jumpserver堡垒机
jumpserver版本:Version 1.4.1-2 (社区版) 主机IP地址:10.0.0.105 准备环境1.安装依赖yum -y install wget sqlite-devel xz g ...