在 Delphi DataSnap (MIDAS) 多層架構中,客戶端可透過 IAppServer 介面呼叫伺服器端 TRemoteDataModule 的公開方法。本文記錄一種常見模式:客戶端傳遞參數 → 伺服器端動態設定 TQuery 參數 → 客戶端 ClientDataSet.Open 取回資料,並討論單一 TDataSetProvider 服務多個 TQuery 的可行性。
type
TServerDataModule = class(TRemoteDataModule)
Query1: TQuery;
DataSetProvider1: TDataSetProvider; // 單一 Provider
// ... 其他 Query2, Query3 ...
public
procedure GetQueryPara(var CPara: OleVariant); // 公開方法
end;
procedure TServerDataModule.GetQueryPara(var CPara: OleVariant);
begin
Query1.Close;
Query1.ParamByName('Code').AsString := CPara; // 設定參數
// 注意:此處不 Open,由客戶端透過 Provider 觸發
end;
procedure TForm1.FormShow(Sender: TObject);
begin
ClientDataSet1.Close;
// 透過 AppServer 介面呼叫伺服器方法
DM.RemoteServer1.AppServer.GetQueryPara('參數值');
ClientDataSet1.Open; // 觸發 Provider 取資料,內部會執行 Query1.Open
end;
DataSetProvider1.DataSet := Query1 (設計時指定)。若需切換查詢,伺服器方法可動態指派 DataSetProvider1.DataSet := Query2 再執行。OleVariant 支援基本型別、陣列、記錄,跨進程封送自動處理。Query1.Close 確保重新準備參數,避免舊參數殘留。| 檢核項目 | 現狀 | 建議 |
|---|---|---|
| 方法宣告於介面 | 未顯式宣告於 IAppServer | DataSnap 自動公開 TRemoteDataModule 所有 public 方法,合法但建議定義專用介面 |
| 參數型別 | var CPara: OleVariant | 合法,var 允許雙向傳遞 (此處僅輸入) |
| 查詢執行時機 | 客戶端 ClientDataSet.Open 觸發 | 標準 DataSnap 流程:Provider 內部呼叫 DataSet.Open |
| 多 Query 切換 | 單一 Provider | 可行,但需注意執行緒安全與狀態殘留,建議一 Query 一 Provider |
| 例外處理 | 無 | 伺服器端應 try...except 包裹並回傳錯誤碼/訊息 |