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

Delphi SQL 程式設計完整指南:從 TQuery 基礎到動態參數與異構查詢

     編輯:Delphi

前言

SQL 作為關聯式資料庫標準語言,已被 Oracle、Sybase、Informix 等主流 DBMS 採用。Delphi 透過 TQuery 元件提供完整 SQL 程式設計支援,包含靜態/動態 SQL、參數綁定、異構查詢、活動/唯讀結果集控制等企業級特性。

一、SQL 語言核心優勢回顧

  • 非程序化:宣告「要什麼」而非「怎麼做」,優化器自動選擇最佳執行計畫
  • 統一語言:DDL、DML、DCL、查詢同一語法,降低學習門檻
  • 可移植性:標準 SQL 讓應用程式跨 DBMS 遷移成本極低

二、TQuery 元件架構與適用資料源

資料源類型支援 SQL 範圍備註
Paradox / dBASE (本地)Local SQL (ANSI-92 子集)SELECT、INSERT、UPDATE、DELETE
InterBase (本地)完整 InterBase SQL含預存程序、觸發器
遠端 DBMS (Oracle, Sybase, MS SQL…)該 DBMS 完整 SQL需安裝對應 SQL Link
異構查詢跨多資料庫聯查如 Oracle 表 JOIN Sybase 表

三、TQuery 基本操作流程

  1. 設定 DatabaseName (BDE 別名或 TDatabase 別名)
  2. 指定 SQL 命令:
    • 設計期:物件檢視器編輯 SQL 屬性 (字串清單)
    • 執行期:Query.Close; Query.SQL.Clear; Query.SQL.Add('...');
  3. 執行:
    • Open:僅 SELECT,回傳結果集
    • ExecSQL:INSERT/UPDATE/DELETE/DDL,無結果集
  4. 動態參數:Prepare → 參數賦值 → Open/ExecSQL

四、靜態 vs 動態 SQL

{ 靜態 SQL - 設計期固定 }
Query1.SQL.Text := 'SELECT * FROM Customer WHERE CustNo = 1234';

{ 動態 SQL - 參數化 }
Query1.SQL.Text := 'SELECT * FROM Customer WHERE CustNo = :Num';
Query1.ParamByName('Num').AsInteger := Edit1.Text.ToInteger;
Query1.Open;

五、參數綁定三大方式

方式適用場景範例
Params[索引]參數順序固定、無名稱依賴Query.Params[0].AsString := 'A'
ParamByName('名稱')參數名稱語意化、順序可變Query.ParamByName('CustNo').AsInteger := 100
DataSource 主從聯動主表游標移動自動帶入參數Master TTable → DataSource → Detail TQuery

六、Prepare/Unprepare 效能優化

  • Prepare:送交 DBMS 剖析、優化、編譯執行計畫,重複執行同一 SQL 必呼叫
  • Unprepare:釋放 DBMS 資源,良好習慣於查詢結束後呼叫
  • 屬性 Prepared 可檢查是否已準備

七、活動結果集 vs 唯讀結果集

條件RequestLiveCanModify結果集類型
預設FalseFalse唯讀
滿足限制TrueTrue活動 (可編輯回寫)
不滿足限制TrueFalse唯讀 (本地) / 錯誤 (遠端)

活動結果集限制:單表、無 ORDER BY、無聚合、無計算欄位、WHERE 僅支援欄位與常數比較 (LIKE, >, <, = 等)。

八、實戰範例 1:互動式 SQL 編輯器

元件:Memo1 (SQL 輸入)、DBGrid1 (結果)、Query1、DataSource1、三按鈕

procedure TForm1.BtnExecuteClick(Sender: TObject);
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text := Memo1.Text;
  try
    Query1.Open;           // SELECT
  except
    Query1.ExecSQL;        // 非 SELECT
  end;
end;

procedure TForm1.BtnClearClick(Sender: TObject);
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.ExecSQL;          // 清空 Grid
end;

九、實戰範例 2:通用資料庫查詢器 (完整原始碼)

支援:別名選擇 → 表選擇 → 欄位選擇 → 運算子 (=, >, LIKE… ) → 值輸入 → 動態建構 WHERE → 執行顯示。核心邏輯見 BitBtn2Click 以 case 產生 strWhere,再組裝 SELECT * FROM "Table" t WHERE t.欄位 運算子 值。

{ 關鍵片段:動態建構 WHERE 子句 }
case etSQLOps(ComboBox1.ItemIndex) of
  soEqual:       strWhere := strField + ' = ' + strQuote + strValue + strQuote;
  soLike:        strWhere := strField + ' LIKE ' + strQuote + strValue + '%' + strQuote;
  soBetween:     strWhere := strField + ' BETWEEN ' + strQuote + strVal1 + strQuote +
                                          ' AND ' + strQuote + strVal2 + strQuote;
  soIn:          strWhere := strField + ' IN (' + strQuote + strValues + strQuote + ')';
  soIsNull:      strWhere := strField + ' IS NULL';
  // ... 其他運算子
end;

strQuery := 'SELECT * FROM "' + strTable + '"';
if strWhere <> '' then strQuery := strQuery + ' WHERE ' + strWhere;

Query1.Close; Query1.SQL.Clear; Query1.SQL.Add(strQuery); Query1.Open;

十、最佳實踐總結

  1. 優先使用 ParamByName 提升可讀性與維護性
  2. 重複查詢務必 Prepare / Unprepare
  3. 大量資料唯讀顯示設定 UniDirectional = True 加速
  4. 需編輯回寫時檢查 CanModify,不符限制改用第二 TQuery 執行 UPDATE
  5. 異構查詢確認所有 SQL Link 已安裝且 BDE 別名設定正確
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved