傳統兩層 (Client-Server):客戶端直連數據庫,邏輯分散、部署維護難、連接數昂貴、安全性弱。
MIDAS (Multi-tier Distributed Application Services) / DataSnap (Delphi 6+) 引入 應用程序服務器 (中間層):
MIDAS.DLL (或 dsnap.dll),無數據庫驅動、無 SQL 邏輯。Windows\System32\MIDAS.DLL (或 dsnap.dll) 到客戶端目錄或系統目錄,**必不可少**。File → New → Other → Multitier → Remote Data Module。MyAppServer (客戶端通過此名連接)。Multiple Instance (推薦,每客戶端一實例,資源均衡、故障隔離)。Single Instance 單進程串行,高併發性能差。Apartment (推薦,每實例單線程,VCL 非線程安全組件安全)。Free/Both 需自行處理線程同步。TADOTable / TSQLTable / TTable (按數據庫類型選擇)。ConnectionString / DatabaseName / SQLConnection。TDataSetProvider (DataSnap 頁),DataSetProvider1.DataSet := ADOTable1。DataSetProvider 自動暴露其數據包接口。編譯 DLL/EXE 即自動在本機註冊 (註冊表 HKCR\CLSID\{GUID})。可用 regsvr32 手動註冊。運行 EXE 形式服務器便於調試 (控制台輸出)。
TDCOMConnection (DataSnap 頁):ServerName := 'MyAppServer.MyAppServer' (ProgID),Connected := True。ComputerName := 'ServerIP或機器名',GUID 自動解析。TClientDataSet (Data Access 頁):RemoteServer := DCOMConnection1,ProviderName := 'DataSetProvider1',Active := True。TDataSource.DataSet := ClientDataSet1,綁定 TDBGrid、TDBNavigator 等數據感知控件。ClientDataSet 在本地內存緩存數據包 (Delta),支持導航、篩選、索引、聚合、**無需服務端交互**。ClientDataSet.ApplyUpdates(-1) 將變更包發送服務端,由 DataSetProvider 解析應用到數據庫 (事務保護)。OnReconcileError 事件處理並發衝突。// 標準 Action: DataSetFirst, DataSetPrior, DataSetNext, DataSetLast
// DataSetInsert, DataSetDelete, DataSetEdit, DataSetPost, DataSetCancel
// DataSetRefresh
// 自定義 Action: ApplyUpdates, ExitApp
procedure TForm1.ApplyUpdatesExecute(Sender: TObject);
begin
ClientDataSet1.ApplyUpdates(-1);
ShowMessage('數據已成功寫入數據庫!');
end;
procedure TForm1.ExitAppExecute(Sender: TObject);
begin Close; end;
| 協議 | 組件 | 適用場景 |
|---|---|---|
| DCOM | TDCOMConnection | Windows 域環境、高性能、雙向回調 |
| TCP/IP (Socket) | TSocketConnection | 跨平台、防火牆友好、需自建服務端監聽程序 |
| HTTP/HTTPS (Web) | TWebConnection / THTTPRIO | Internet、穿透防火牆、Web 服務集成、支援 SOAP/JSON |
| CORBA | TCorbaConnection | 異構系統集成 (Java/C++ 服務端) |