首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 多層 C/S 架構:客戶端呼叫應用伺服器自訂方法 (AppServer.GetQueryPara 範例)

     編輯:Delphi

在 Delphi DataSnap (MIDAS) 多層架構中,客戶端可透過 IAppServer 介面呼叫伺服器端 TRemoteDataModule 的公開方法。本文記錄一種常見模式:客戶端傳遞參數 → 伺服器端動態設定 TQuery 參數 → 客戶端 ClientDataSet.Open 取回資料,並討論單一 TDataSetProvider 服務多個 TQuery 的可行性。

伺服器端實作 (RemoteDataModule)


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;

架構說明

  • 單一 Provider 多 Query:DataSetProvider1.DataSet := Query1 (設計時指定)。若需切換查詢,伺服器方法可動態指派 DataSetProvider1.DataSet := Query2 再執行。
  • 參數傳遞:OleVariant 支援基本型別、陣列、記錄,跨進程封送自動處理。
  • 狀態管理:Query1.Close 確保重新準備參數,避免舊參數殘留。

合法性與最佳實踐檢核

改良版伺服器方法 (含錯誤回傳)


function TServerDataModule.SetQueryParam(const ACode: string; out AErrMsg: string): Boolean;
begin
  Result := False;
  AErrMsg := '';
  try
    Query1.Close;
    Query1.ParamByName('Code').AsString := ACode;
    Result := True;
  except
    on E: Exception do
      AErrMsg := E.Message;
  end;
end;

客戶端改呼叫 AppServer.SetQueryParam('值', ErrMsg) 並檢查回傳 Boolean。

小結

客戶端呼叫 AppServer.自訂方法 設定伺服器端查詢參數,再 ClientDataSet.Open 取數,是 DataSnap 典型的「參數化查詢」模式。雖單一 Provider 服務多 Query 技術上可行,但生產環境建議 **一 Query 一 Provider** 或改用 TClientDataSet.CommandText (DataSnap REST/JSON 時代) 簡化架構。核心原則:伺服器端封裝資料邏輯,客戶端僅負責參數傳遞與 UI 綁定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
檢核項目現狀建議
方法宣告於介面未顯式宣告於 IAppServerDataSnap 自動公開 TRemoteDataModule 所有 public 方法,合法但建議定義專用介面
參數型別var CPara: OleVariant合法,var 允許雙向傳遞 (此處僅輸入)
查詢執行時機客戶端 ClientDataSet.Open 觸發標準 DataSnap 流程:Provider 內部呼叫 DataSet.Open
多 Query 切換單一 Provider可行,但需注意執行緒安全與狀態殘留,建議一 Query 一 Provider
例外處理無伺服器端應 try...except 包裹並回傳錯誤碼/訊息