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
参考:http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/DataSnap.FireDAC_DBX_Sample (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)客户端
原文地址:https://www.cnblogs.com/hopesun/p/8711226.html