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

C++Builder TQuery 參數化查詢與嵌入 SQL 實戰指南

     編輯:關於C++

引言

在 C++Builder (VCL) 資料庫開發中,TQuery 元件是執行 SQL 查詢的核心工具。掌握參數化查詢與動態 SQL 建構,能有效防止 SQL 注入、提升效能並簡化代碼維護。本文以實戰範例詳細說明兩大核心用法。

一、參數化查詢:標準三步驟

1. SQL 屬性定義參數佔位符

Query1->SQL->Text = "SELECT * FROM Employees WHERE Dept = :DeptName AND Salary > :MinSal";
  • 冒號 : 前綴標識參數(:DeptName、:MinSal)。
  • 設計時在 Object Inspector 中點選 Params 屬性,可視化設定各參數的 DataType、ParamType (ptInput/ptOutput/ptInputOutput)。

2. 執行前賦值參數

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 等屬性自動處理型別轉換與引號逸出。

3. 結果綁定顯示

DataSource1->DataSet = Query1;
DBGrid1->DataSource = DataSource1;
DBNavigator1->DataSource = DataSource1;  // 可選:導航列

二、動態嵌入 SQL:運行期構建查詢

適用於查詢條件不固定、使用者自訂篩選的場景。

標準流程範例

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 的執行計畫,提升效能。
  • 型別安全:VCL 參數屬性自動處理日期格式、字串逸出、Blob 串流等細節。

常見陷阱與最佳實踐

陷阱後果正確做法
用字串拼接 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。
  • Unicode 支援:C++Builder 2009+ 內建 Unicode,AsWideString/AsString 均可,資料庫連接屬設定正確字元集(如 charset=utf8)。

總結

TQuery 參數化查詢是 C++Builder 資料庫開發的基石:SQL 靜態部分寫死、動態條件用參數佔位、執行前由 ParamByName 逐一賦值。配合動態 SQL 建構技巧,即能應對從簡單查詢到複雜多條件篩選的全部實戰需求,同時保證安全與效能。

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