变量定义:

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. 关于js中的then(盗)

    then()相关的东西包括但不限于:promise,thien.js 虽然还没彻底搞清楚这些个玩意儿,但是  现在知道了  then()是干嘛的了 最主要的,是解决了异步方法立刻返回的问题  这个特性 ...

  2. 运行外部exe

    bool CFileOperate::lauchCAD() { //启动ZWCAD CString OutputPath; STARTUPINFO si; //一些必备参数设置 memset(& ...

  3. zay大爷的膜你题 D2T1 江城唱晚

    依旧是外链... 这一次网易云爆炸了....所以我决定后面的都用QQ 下面是题面 这道题是一道傻逼题 数学题,我们仔细看一看,首先有m朵花的话,我们就有m!种排列方式(也就是m的全排列), 然后我们假 ...

  4. RTSP详解

    关于 RTSP. RTSP协议是一个非常类似HTTP协议的流控制协议.它们都使用纯文本来发送信息,而且rtsp协议的语法也和HTTP类似.Rtsp一开始这样设计,也是为了能够兼容使用以前写的HTTP协 ...

  5. html/css:简单网页

    html: <!DOCTYPE html> <html> <head> <meta http-equiv=“content-type” content=“te ...

  6. Python中的函数(3)

    一.包含返回值的函数 下面来看一个函数,它接收名和姓并返回完整的姓名: def get_formatted_name(first_name,last_name): """ ...

  7. SCI journals on Energy

    SCI journals on Energy Table of Contents 1. SCI- Clarivate - Thomson Reuters 1 SCI- Clarivate - Thom ...

  8. C语言学习13

    快速排序 //快速排序 #include <stdio.h> void quicksort(int a[], int left, int right); void main() { ] = ...

  9. CS academy Growing Trees【模板】DP求树的直径

    [题意概述] 给出一棵树,树上的边有两个值a和b,你可以在[0,limit]范围内选择一个整数delta,树上的边的权值为a+b*delta,现在问当delta为多少的时候树的直径最小.最小直径是多少 ...

  10. SqlParameter[] parameters

    SqlParameter[] parameters = { new SqlParameter("@rdTypeName", readertype.rdTypeName), new ...