Delphi 使用 Datasnap 的几种三层应用技术总结?

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 数据集,需要采用下列方式:

利用 TFDQuery 建立两数据集,一个是 主Master ,另一个的 Masterdata 属性设置为主数据集。

4)(好,供参考!)服务端 可以只用一个:TFDConnection + TFDQuery + TDatasetProvider 向客户端提供数据,

但 TDatasetProvider 的属性 Options 选择 poAllowCommandText 为 True ,即允许 TFDQuery 不管理其SQL 的值,

直接从客户端 接收 SQL ,并向客户端返回 查询数据集。

客户端 的 TClientDataSet 通过 CommandText 属性设置 SQL 命令,可以带参数,并从Params 获取参数值,将SQL发给服务端,并接收返回数据。

这样,可以一个服务端 TDatasetProvider ,服务多个客户端。当然,会话 Session 采用 一次性的比较合适,或者 获取数据完成,断开 SQLConn连接。

参考《DataSnap ClientdataSet 三层中主从表的操作》搞定主从表的设置!!!

2、在 Datasnap 服务端 使用 TFDQuery,客户端 使用 TSQLConnection 或者 TDSRestConnection ,数据交换用TStream

参考:http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/DataSnap.FireDAC_DBX_SampleDataSnap 联合 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)客户端 可以采用两种 连接方式:1)TSQLConnection (DBX 方式);2)TDSRestConnection (Rest方式)

通过两者(右点)可以 生成 服务端代理类 (Generate Datasnap Client Classes),调用 代理类的方法,获取 服务端数据流。

TFDTableAdapter (+ 同一 TFDSchemaAdapter,设置 DatSTableName 为服务端 的 TFDQuery 名 ) ==》 TMemTable ==》 TDataSource (主 -- 客户)

TFDTableAdapter (+ 同一 TFDSchemaAdapter)设置 DatSTableName 为服务端 的 TFDQuery 名) ==》 TMemTable ==》 TDataSource (从 -- 订单)

如何 获取数据 ,参考 示例!(省略。。。) 绑定GRID 。

LMemStream := TServerMethodsClient(ServerConnection).StreamGet 代理类通过连接组件,获取服务端 数据流 TStream;

FDSchemaAdapter.LoadFromStream(LMemStream, TFDStorageFormat.sfBinary) 从流中加载 数据集。

3、(考虑!)应用 Rest Datasnap 服务端 ,Http通信, TFDJsonDataSets 与 TFDJsonDelta 格式交换数据

TFDJsonDataSets 功能 参考《Delphi 10.1 Berlin DataSnap 开发手册》

4、(推荐)使用 Rest Client 连接 Restful 服务,不限定于(Delphi 产生的),关注 :TRESTResponseDataSetAdapter 的应用。

《Delphi 10.1 Berlin FireDAC 数据库开发手册》 P109 第 3-1-2 章节 介绍了应用 ,使用 TFDMemTable 处理 Rest 获得的数据。

使用 TRESTResponse数据提供给 TFDMemTable ,包含了 元数据信息。

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/REST_Client_Library