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

Delphi 資料存取元件架構深度解析:TSession、TTable/TQuery、TDataSource、TField 與報表整合

     編輯:Delphi

一、資料存取元件階層架構

TSession (全域單例,不可見)
  └─ TDatabase (客戶/伺服器連線參數)
       └─ TDataSet (抽象基類)
            ├─ TTable (單表存取)
            └─ TQuery (SQL 查詢)
                 └─ TDataSource (橋樑)
                      └─ 資料瀏覽元件 (DBGrid, DBEdit…)
TField (欄位物件) ── 由 DataSet 動態建立或 Fields Editor 靜態建立

二、TSession 核心屬性與方法

屬性/方法用途
DatabaseCount / Databases[]目前 Session 管理的資料庫別名清單
KeepConnectionsTrue=保持非活動資料庫連線 (預設)
NetFileDirBDE 網路控制檔路徑 (多使用者環境關鍵)
PrivateDir暫存檔目錄
GetAliasNames取得 BDE 定義的所有別名
GetTableNames列出指定別名下的所有資料表
GetDriverNames列出已安裝的 BDE 驅動程式
DropConnections切斷所有資料庫連線

範例:動態列出別名與資料表

procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  Session.GetAliasNames(ListBoxAlias.Items);
  Screen.Cursor := crDefault;
end;

procedure TForm1.ListBoxAliasClick(Sender: TObject);
var Alias: string;
begin
  Alias := ListBoxAlias.Items[ListBoxAlias.ItemIndex];
  ListBoxTables.Clear;
  Session.GetTableNames(Alias, '', True, True, ListBoxTables.Items);
end;

三、TTable/TQuery 共用資料集核心功能

1. 導航與狀態

  • First, Prior, Next, Last, MoveBy
  • State:dsBrowse, dsEdit, dsInsert, dsSetKey
  • EOF, BOF, RecordCount, RecNo

2. 資料維護方法

方法功能
Edit進入編輯模式
Insert / Append插入/附加新記錄 (需後續 Post)
Post寫入修改/新增
Cancel取消當前操作
Delete刪除當前記錄
AppendRecord / InsertRecord單行插入 (含欄位值陣列,自動 Post)
SetRecord批次修改多欄位 (需 Edit→SetRecord→Post)

3. 書籤

var BM: TBookmark;
BM := Table1.GetBookmark;
try
  Table1.DisableControls;
  Table1.First;
  while not Table1.EOF do begin ... Table1.Next; end;
finally
  Table1.GotoBookmark(BM);
  Table1.FreeBookmark(BM);
  Table1.EnableControls;
end;

4. 篩選與範圍

  • Filter / Filtered:客戶端字串篩選
  • SetRange/SetRangeStart/SetRangeEnd + ApplyRange:索引式範圍 (Paradox/dBase 僅限索引欄位)
  • CancelRange:取消範圍

5. 查找

模式方法組合特點
GotoSetKey → 指定欄位值 → GotoKey/GotoNearest精確/最近匹配
FindFindKey([值]) / FindNearest([值])單行呼叫,陣列傳參

6. 主從關聯

{ 設計期:Field Link Designer }
TableDetail.MasterSource := DataSourceMaster;
TableDetail.MasterFields := 'CustNo';  // 或 'OrderNo;CustNo'
{ 執行期自動同步:主表游標移動 → 從表篩選 }

7. 常用事件

  • Before/After Open/Close/Insert/Edit/Post/Cancel/Delete
  • OnCalcFields:計算欄位賦值
  • OnFilterRecord:自訂篩選邏輯

四、TDataSource:橋樑角色

屬性/事件說明
DataSet指向 TTable/TQuery (可跨 Form 指派)
AutoEditTrue=使用者輸入自動進入編輯模式
OnDataChange記錄指標移動觸發 (多控件同步)
OnStateChangeDataSet 狀態變更觸發 (控制按鈕啟用/禁用)
OnUpdateDataPost 前觸發 (非資料感知控件同步)

狀態同步範例

procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
  BtnInsert.Enabled := (Table1.State = dsBrowse);
  BtnCancel.Enabled := Table1.State in [dsEdit, dsInsert, dsSetKey];
end;

五、TField 欄位物件體系

1. 常見欄位類別對應

TField 子類別資料庫型別
TStringFieldCHAR, VARCHAR
TIntegerFieldINTEGER
TFloatFieldFLOAT, DOUBLE
TCurrencyFieldMONEY, CURRENCY
TDateTimeFieldDATETIME, TIMESTAMP
TBlobFieldBLOB, IMAGE, MEMO

2. 關鍵屬性

  • DisplayFormat / EditFormat:顯示/編輯格式 (配合 FormatFloat/FormatDateTime)
  • EditMask:輸入遮罩 (如電話 `!\(999\)000-0000;0;`)
  • Visible:DBGrid 是否顯示
  • ReadOnly:禁止修改
  • Calculated = True:標記為計算欄位

3. 型別轉換函數

Edit1.Text := Table1Field.AsString;        // 任意型別 → 字串
Table1Field.AsInteger := StrToInt(Edit1.Text); // 字串 → 整數
{ 完整對照見原文表 15.9 }

4. 存取方式

  • 靜態欄位:Table1FieldName.Value (直接命名)
  • 動態欄位:Table1.Fields[索引] 或 Table1.FieldByName('名稱')

5. Fields Editor 操作

  • Add Fields:從資料庫結構建立永久欄位
  • New Field → Calculated:建立計算欄位,配合 OnCalcFields 賦值
  • Delete:移除永久欄位 (屬性設定隨之消失)

六、TReport 整合 ReportSmith

  • ReportName/ReportDir:指定 .rpt 檔
  • Preview:True=預覽,False=直接列印
  • AutoUnload:單一報表 True,批次報表 False
  • InitialValues:傳遞報表變數 VarName := Value
  • 方法:Run, RunMacro, Connect, SetVariable, ReCalcReport

七、TBatchMove 大量資料搬移

  • Mode:batAppend, batUpdate, batAppendUpdate, batCopy, batDelete
  • Source/Destination:指定來源/目標 DataSet
  • Mappings:欄位對應清單 DestField = SrcField
  • Execute:執行搬移

八、多 Form 共用單一 DataSet 實作

{ Form1 建立 Table1, DataSource1 }
{ Form2 僅建立 DataSource2 }
procedure TForm2.FormCreate(Sender: TObject);
begin
  DataSource2.DataSet := Form1.Table1;  // 關鍵:共用同一 DataSet
end;
{ 兩 Form 的 DBGrid/DBEdit 綁定各自 DataSource,即時同步 }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved