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

C++Builder 5 ADO 資料庫程式設計:從元件架構到 Master/Detail 實作

     編輯:關於C++

ADO 在 BCB 5 的定位

C++Builder 5 引入 ADOExpress (dbGo) 元件套件,將 Microsoft ADO (ActiveX Data Objects) 封裝為 VCL 元件,提供與 BDE/IBX 相似的設計時體驗,但底層直通 OLE DB Provider,支援 無 DSN 連線、斷開式記錄集、XML 持久化、ASP/COM+ 整合 等現代特性。遷移既有 BDE 專案只需替換資料存取元件,資料感知控制項 (TDBGrid, TDBEdit 等) 完全相容。

核心 ADO 元件對照表

元件用途對應傳統元件
TADOConnection資料庫連線管理、交易控制TDatabase
TADOTable單一資料表操作 (索引、篩選、編輯)TTable
TADOQuerySQL 查詢、更新、預存程序TQuery
TADODataSet通用資料集 (支援 Shape、命令文字、存取程序)TQuery/TTable 合體
TADOCommand執行不傳回資料集的命令 (DDL、DML、Action Query)TQuery (ExecSQL)
TADOStoredProc預存程序執行TStoredProc
TDataSource資料集與資料感知控制項橋樑TDataSource (同樣)

連線字串設定 (ConnectionString)

雙擊 TADOConnection → ConnectionString 屬性省略號 → 建立:

  1. 提供者:Microsoft Jet 4.0 OLE DB Provider (Access .mdb) 或 Microsoft OLE DB Provider for SQL Server、OraOLEDB.Oracle 等。
  2. 資料來源:輸入 .mdb 完整路徑或伺服器名稱。
  3. 驗證:Windows 整合驗證或帳號/密碼 (Access 需 Jet OLEDB:Database Password=xxx)。
  4. 測試連線 → 確定。

程式碼設定:


ADOConnection1->ConnectionString =
    "Provider=Microsoft.Jet.OLEDB.4.0;"
    "Data Source=C:\\Data\\Northwind.mdb;"
    "Jet OLEDB:Database Password=secret;"
    "Persist Security Info=False;";
ADOConnection1->Connected = true;

Master/Detail 實作:Shape 指令 (Hierarchical Recordset)

ADO 支援 Shape 指令 定義階層式資料集,無需撰寫嵌套查詢程式碼即可實現主/從表關聯。

範例:Northwind 訂單 (Orders) → 訂單明細 (Order Details)


// 設計時設定元件
// ADOConnection1: 已設定 ConnectionString, Connected=true
// ADODataSet1 (Master): Connection=ADOConnection1
// ADODataSet2 (Detail): 稍後設定 DataSetField
// DataSource1 -> ADODataSet1 -> DBGrid1
// DataSource2 -> ADODataSet2 -> DBGrid2

// ADODataSet1 CommandText (Shape 指令)
SHAPE {SELECT * FROM Orders}
APPEND ({SELECT * FROM [Order Details]} AS Details
        RELATE OrderID TO OrderID)

// 執行後,ADODataSet1 會包含一個名為 "Details" 的欄位,型別為 TDataSetField

// 步驟 1: 開啟 ADODataSet1
ADODataSet1->Open();

// 步驟 2: 開啟 Fields Editor (右鍵 ADODataSet1 -> Fields Editor -> 右鍵 -> Add all fields)
//     確認 "Details" 欄位存在 (型別 TDataSetField)

// 步驟 3: 設定 ADODataSet2
ADODataSet2->DataSetField = ADODataSet1->FieldByName("Details"); // 或物件檢查器下拉選擇

// 步驟 4: 開啟 ADODataSet2 (會自動隨 Master 游標移動而同步)
ADODataSet2->Open();

// 步驟 5: (選擇性) 隱藏 DBGrid1 中的 Details 欄位
// DBGrid1 -> Columns 編輯器 -> Add all fields -> 選取 Details -> Delete

Shape 指令語法重點


SHAPE {parent-command}
APPEND ({child-command} AS alias RELATE parent-field TO child-field)
[APPEND ...]  // 可多層巢狀
  • parent-command、child-command 為標準 SQL SELECT。
  • AS alias 為子資料集在父資料集中的欄位名稱。
  • RELATE 指定關聯欄位 (需同名或同型別)。

參數化查詢與安全性

嚴禁字串拼接 SQL (防 SQL Injection),一律使用參數:


ADOQuery1->SQL->Text = "SELECT * FROM Customers WHERE Country = :Country AND City = :City";
ADOQuery1->Parameters->ParamByName("Country")->Value = "Germany";
ADOQuery1->Parameters->ParamByName("City")->Value = "Berlin";
ADOQuery1->Open();

斷開式記錄集

ADORecordset 支援 CursorLocation = clUseClient 時將資料快取在用戶端,斷開連線後仍可瀏覽、編輯、排序、篩選,重新連線時批次更新:


ADODataSet1->CursorLocation = clUseClient;
ADODataSet1->LockType = ltBatchOptimistic;
ADODataSet1->Open();
// ... 離線操作 ...
ADODataSet1->UpdateBatch(); // 批次寫回

常見遷移陷阱

問題原因解決
欄位型別不符OLE DB Provider 對應型別與 BDE 不同Fields Editor 重新建立欄位,檢查 DataType
AutoInc 欄位取值Access Jet 4.0 需在 Append 後重新查詢使用 SELECT @@IDENTITY 或 SCOPE_IDENTITY() (SQL Server)
大量資料效能預設游標類型可能為伺服器端設定 CursorLocation=clUseClient, CacheSize 適當值
中文亂碼字碼頁不匹配連線字串加 CharacterSet=Unicode 或確認資料庫/Provider 字碼頁

程式碼範例:動態建立 ADO 元件


void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TADOConnection* conn = new TADOConnection(this);
    conn->ConnectionString = "Provider=SQLOLEDB.1;Data Source=.;Initial Catalog=TestDB;Integrated Security=SSPI;";
    conn->Connected = true;

    TADOQuery* qry = new TADOQuery(this);
    qry->Connection = conn;
    qry->SQL->Text = "SELECT GETDATE() AS ServerTime";
    qry->Open();

    ShowMessage("伺服器時間: " + qry->FieldByName("ServerTime")->AsString);

    qry->Close();
    conn->Connected = false;
    // 元件擁有者為 Form,Form 銷毀時自動釋放
}

結語

ADOExpress 讓 BCB 5 具備現代化資料存取能力,Shape 指令簡化 Master/Detail 實作,斷開式記錄集支援離線應用。新專案建議直接使用 TADOConnection + TADOQuery/TADODataSet,避免 TADOTable 的限制。配合參數化查詢、適當游標選項,可構建高效能、安全的資料庫應用程式。

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