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= ...
随机推荐
- 关于js中的then(盗)
then()相关的东西包括但不限于:promise,thien.js 虽然还没彻底搞清楚这些个玩意儿,但是 现在知道了 then()是干嘛的了 最主要的,是解决了异步方法立刻返回的问题 这个特性 ...
- 运行外部exe
bool CFileOperate::lauchCAD() { //启动ZWCAD CString OutputPath; STARTUPINFO si; //一些必备参数设置 memset(& ...
- zay大爷的膜你题 D2T1 江城唱晚
依旧是外链... 这一次网易云爆炸了....所以我决定后面的都用QQ 下面是题面 这道题是一道傻逼题 数学题,我们仔细看一看,首先有m朵花的话,我们就有m!种排列方式(也就是m的全排列), 然后我们假 ...
- RTSP详解
关于 RTSP. RTSP协议是一个非常类似HTTP协议的流控制协议.它们都使用纯文本来发送信息,而且rtsp协议的语法也和HTTP类似.Rtsp一开始这样设计,也是为了能够兼容使用以前写的HTTP协 ...
- html/css:简单网页
html: <!DOCTYPE html> <html> <head> <meta http-equiv=“content-type” content=“te ...
- Python中的函数(3)
一.包含返回值的函数 下面来看一个函数,它接收名和姓并返回完整的姓名: def get_formatted_name(first_name,last_name): """ ...
- SCI journals on Energy
SCI journals on Energy Table of Contents 1. SCI- Clarivate - Thomson Reuters 1 SCI- Clarivate - Thom ...
- C语言学习13
快速排序 //快速排序 #include <stdio.h> void quicksort(int a[], int left, int right); void main() { ] = ...
- CS academy Growing Trees【模板】DP求树的直径
[题意概述] 给出一棵树,树上的边有两个值a和b,你可以在[0,limit]范围内选择一个整数delta,树上的边的权值为a+b*delta,现在问当delta为多少的时候树的直径最小.最小直径是多少 ...
- SqlParameter[] parameters
SqlParameter[] parameters = { new SqlParameter("@rdTypeName", readertype.rdTypeName), new ...