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

Delphi SQL 程式設計:動態參數賦值與預處理機制詳解

     編輯:Delphi

17.4 動態 SQL 參數賦值的三種核心方法

在 Delphi 資料庫開發中,動態 SQL(參數化查詢)是實現靈活、安全資料操作的關鍵。TQuery 元件提供了三種截然不同的參數賦值途徑,開發者可根據場景靈活選擇。

17.4.1 利用 Params 陣列按索引賦值

TQuery 元件的 Params 屬性是一個在執行期動態建立的零基底陣列,其索引順序嚴格對應 SQL 陳述式中參數出現的先後順序。這意味著開發者必須精確掌握參數序位,否則極易導致資料錯位。

以插入客戶資料為例:

INSERT INTO Customer (CustNo, Name, Country)
VALUES (:CustNo, :Name, :Country)

對應的程式碼賦值邏輯為:

Query1.Params[0].AsString := '1988';      // 對應 :CustNo
Query1.Params[1].AsString := 'Lichtenstein'; // 對應 :Name
Query1.Params[2].AsString := 'USA';        // 對應 :Country

注意: 此法雖直接,但當 SQL 陳述式修改導致參數順序變更時,所有賦值代碼都需同步調整,維護成本較高。

17.4.2 使用 ParamByName 方法按名稱賦值

ParamByName 函式允許開發者直接透過參數名稱進行賦值,完全脫離索引順序的束縛。同樣以上例為例:

Query1.ParamByName('CustNo').AsString := '1988';
Query1.ParamByName('Name').AsString := 'Lichtenstein';
Query1.ParamByName('Country').AsString := 'USA';

此方式程式碼可讀性極強,且對 SQL 結構調整具有天然免疫力,是實務開發中的首選方案。

17.4.3 透過 DataSource 屬性實現主從連動賦值

當參數值來源於另一資料集(如主表游標位置)時,手動賦值顯得笨拙。Delphi 提供了 DataSource 屬性自動綁定機制:

  • 將 TQuery 的 DataSource 指向另一 TDataSource(該來源連接主表查詢)
  • 執行期,Delphi 自動掃描未賦值參數,並在來源資料集中尋找同名欄位
  • 找到匹配欄位後,自動將當前記錄的欄位值賦予參數
  • 主表游標移動觸發參數變更,進而自動重新查詢從表資料

此機制完美實現了「主從式」關聯查詢,無需編寫額外同步代碼。

17.4.4 Prepare 方法:效能優化的關鍵槓桿

Prepare 方法將參數化 SQL 送交資料庫引擎進行語法分析、查詢計畫生成與優化。雖非強制調用,但其效能紅利顯著:

  • 單次執行: Delphi 會隱式調用 Prepare,再隱式 Unprepare,來回開銷抵消優化收益
  • 重複執行(參數值變化): 顯式調用 Prepare 一次,後續僅修改參數值並呼叫 Open/ExecSQL,省去重複解析優化,效能提升可達數倍

最佳實踐模式:

// 表單建立時
Query1.SQL.Text := 'SELECT * FROM Orders WHERE CustNo = :CustNo';
Query1.Prepare;  // 一次性投資

// 後續查詢
Query1.ParamByName('CustNo').AsInteger := CurrentCustNo;
Query1.Open;     // 輕量級執行

// 程式結束前
Query1.Unprepare; // 釋放資料庫端資源

Prepared 唯讀屬性可檢查查詢是否已預處理。修改 SQL 屬性時,Delphi 會自動關閉並取消預處理,保證狀態一致性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved