在 C++Builder (VCL) 資料庫開發中,TQuery 元件是執行 SQL 查詢的核心工具。掌握參數化查詢與動態 SQL 建構,能有效防止 SQL 注入、提升效能並簡化代碼維護。本文以實戰範例詳細說明兩大核心用法。
Query1->SQL->Text = "SELECT * FROM Employees WHERE Dept = :DeptName AND Salary > :MinSal";
: 前綴標識參數(:DeptName、:MinSal)。Params 屬性,可視化設定各參數的 DataType、ParamType (ptInput/ptOutput/ptInputOutput)。Query1->Close(); // 確保關閉
Query1->ParamByName("DeptName")->AsString = EditDept->Text;
Query1->ParamByName("MinSal")->AsFloat = StrToFloatDef(EditSal->Text, 0);
Query1->Open(); // SELECT 用 Open()
ParamByName:語義清晰,不怕 SQL 參數順序變動。AsString/AsInteger/AsFloat/AsDateTime 等屬性自動處理型別轉換與引號逸出。DataSource1->DataSet = Query1;
DBGrid1->DataSource = DataSource1;
DBNavigator1->DataSource = DataSource1; // 可選:導航列
適用於查詢條件不固定、使用者自訂篩選的場景。
void __fastcall TForm1::BtnSearchClick(TObject *Sender)
{
Query1->Close();
Query1->SQL->Clear();
AnsiString sql = "SELECT * FROM Books WHERE 1=1"; // 1=1 方便後續 AND 拼接
if (!EditTitle->Text.IsEmpty())
sql += " AND Title LIKE :Title";
if (!EditAuthor->Text.IsEmpty())
sql += " AND Author = :Author";
if (CheckYear->Checked)
sql += " AND PubYear >= :Year";
Query1->SQL->Text = sql;
// 依動態 SQL 實際參數賦值
if (!EditTitle->Text.IsEmpty())
Query1->ParamByName("Title")->AsString = "%" + EditTitle->Text + "%";
if (!EditAuthor->Text.IsEmpty())
Query1->ParamByName("Author")->AsString = EditAuthor->Text;
if (CheckYear->Checked)
Query1->ParamByName("Year")->AsInteger = SpinYear->Value;
Query1->Open();
}
| 陷阱 | 後果 | 正確做法 |
|---|---|---|
| 用字串拼接 SQL 含使用者輸入 | SQL 注入風險、格式錯誤 | 永遠用參數化查詢 |
ExecSQL() 執行 SELECT | 不回傳結果集 | SELECT 用 Open(),DML 用 ExecSQL() |
| 參數名稱大小寫不一致 | 執行時報錯 "Parameter not found" | 統一命名風格,ParamByName 不分大小寫但建議一致 |
| 未關閉 Query 就修改 SQL | "Cannot modify SQL property while dataset is open" | 先 Close() 再 Clear()/Text= |
Query1->Params->ArraySize = 100; 設定陣列大小,填入多組參數後一次 ExecSQL() 提交,大幅降低網路往返。ParamType = ptOutput,執行後讀取 ParamByName("@RetVal")->AsInteger。AsWideString/AsString 均可,資料庫連接屬設定正確字元集(如 charset=utf8)。TQuery 參數化查詢是 C++Builder 資料庫開發的基石:SQL 靜態部分寫死、動態條件用參數佔位、執行前由 ParamByName 逐一賦值。配合動態 SQL 建構技巧,即能應對從簡單查詢到複雜多條件篩選的全部實戰需求,同時保證安全與效能。