• 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;

  • 相关阅读:
    计算机网络面试题总结
    为0LTP选择RDMBS时,你都需要考虑哪些?
    Redis集群搭建与简单使用
    Innodb关键特性之自适用Hash索引
    关于MySQL的commit非规律性失败案例的深入分析
    MySQL存储写入性能严重抖动分析
    【Linux】管理文件系统
    【Linux】YUM源搭建
    【Linux】计划任务
    【Linux】日志分析及管理
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/5663372.html
Copyright © 2020-2023  润新知