在 Delphi 資料庫開發中,動態 SQL(參數化查詢)是實現靈活、安全資料操作的關鍵。TQuery 元件提供了三種截然不同的參數賦值途徑,開發者可根據場景靈活選擇。
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 陳述式修改導致參數順序變更時,所有賦值代碼都需同步調整,維護成本較高。
ParamByName 函式允許開發者直接透過參數名稱進行賦值,完全脫離索引順序的束縛。同樣以上例為例:
Query1.ParamByName('CustNo').AsString := '1988';
Query1.ParamByName('Name').AsString := 'Lichtenstein';
Query1.ParamByName('Country').AsString := 'USA';
此方式程式碼可讀性極強,且對 SQL 結構調整具有天然免疫力,是實務開發中的首選方案。
當參數值來源於另一資料集(如主表游標位置)時,手動賦值顯得笨拙。Delphi 提供了 DataSource 屬性自動綁定機制:
DataSource 指向另一 TDataSource(該來源連接主表查詢)此機制完美實現了「主從式」關聯查詢,無需編寫額外同步代碼。
Prepare 方法將參數化 SQL 送交資料庫引擎進行語法分析、查詢計畫生成與優化。雖非強制調用,但其效能紅利顯著:
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 會自動關閉並取消預處理,保證狀態一致性。