通过 TFDQuery/TFDTable 向 TDatasetProvider 提供数据集;(!执持数据库新版本) 注意

时间:2021-09-08 03:38:34

Delphi 使用 Datasnap 进行三层应用开发,堆集了几种技术,总结如下:

1、(保举!在 Datasnap 处事端 使用 TDatasetProvider,客户端 使用   TDSProviderConnection

1)给与 Datasnap Server ,可以使用TCP/IP、Http 通信。TDatasetProvider 能够供给 “元数据与业务数据”。

保举:给与(FireDac技术) TFDConnection 连接数据库,通过 TFDQuery/TFDTable 向 TDatasetProvider 供给数据集;(!执持数据库新版本)

注意:也可以给与(DBX技术)TSQLConnect、TSQLDataSet/TSQLQuery/TSQLTable/TSQLStoredProc,向 TDatasetProvider 供给数据集;

2)客户端使用(DBExpress技术 DBX)  TSQLConnection + TDSProviderConnection  ==》TClientDataSet  ==》TDataSource

TSQLConnection  设置为 DataSnapCONNECTION,驱动 DataSnap;

TDSProviderConnection  设置:TSQLConnection 的实例(驱动 DataSnap);ServerClassName  设置 DataSnap处事端 供给处事的 “类名称”;

TClientDataSet   设置:RemoteServer 为 TDSProviderConnection 的实例,ProviderName 是处事端 的相应“类”下的 TDatasetProvider 实例。

提示1:(1 FRM)TClientDataSet 可以 绑定  TStringGrid  ,,或者 (2 VCL)通过增加 TDataSource  连接 TDBGrid 。

提示2:客户端 TClientDataSet  的变换,如何返回处事器端,以及客户端数据集的盘问、排序、过滤等,

建议参考《Delphi2006-DbExpress高效数据库开发》这本书;《Delphi 10.1 Berlin DataSnap 开发手册》第一章也有介绍本项技术。

3)仿佛一个TDatasetProvider,只能供给一个Dataset,如果要成立 主Master/从Detail 数据集,需要给与下列方法:

2、在 Datasnap 处事端 使用 TFDQuery,客户端 使用   TDSProviderConnection 

参考:  (DataSnap 联合 FireDAC

1)给与 Datasnap Server ,可以使用TCP/IP、Http 通信。

TFDConnection 连接数据库,通过 TFDQuery  (设置 + TFDSchemaAdapter)  供给数据集 ,  ==》TDataSource (主) 

通过 TFDQuery  (设置 + TFDSchemaAdapter,设置 MasterSource 、MasterFields 为 “主数据源/ID”) 供给数据集 ,

==》TDataSource (从) 

果然处事类(Class)的 发送数据集要领 ,以 TStream 类型的方法 ,借助 TFDSchemaAdapter 发送数据,接收更新、并写入数据库。

function TServerMethods.StreamGet: TStream;

                    begin
                         Result := TMemoryStream.Create;
                         try
                            qCustomers.Close;    //主数据集
                            qCustomers.Open;
                            qOrders.Close;         //从数据集
                            qOrders.Open;
                            FDSchemaAdapter.SaveToStream(Result, TFDStorageFormat.sfBinary);
                            Result.Position := 0;
                         finally

                            //
                       end;
                   end;

                  以及 接收要领:

function TServerMethods.StreamPost(AStream: TStream): string;
                   var
                       LMemStream: TMemoryStream;
                       LErrors: Integer;
                   begin
                         Result := ‘‘;
                        // 获取 数据流 从客户端    Retreive entire stream from client
                        LMemStream := CopyStream(AStream);          //复制 数据流
                        LMemStream.Position := 0;
                      try
                          FDSchemaAdapter.LoadFromStream(LMemStream, TFDStorageFormat.sfBinary);
                          LErrors := FDSchemaAdapter.ApplyUpdates
                       finally
                          LMemStream.Free;
                          if LErrors > 0 then
                             Result := Format(sErrorsOnApplyUpdates , [GenerateErrorMessage]);
                       end;
                    end;

2)客户端