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 數據集,需要采用下列方式:
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)客戶端
Delphi 使用 Datasnap 的幾種三層應用技術總結