UniDAC使用教程(三):主從關係

下載UniDAC最新版本數據庫

Universal Data Access Components (UniDAC)是一款通用數據庫訪問組件,提供了多個數據庫的直接訪問,如針對Windows的Delphi, C++Builder, Lazarus (以及 Free Pascal) , Mac OS X, iOS, Android, Linux和64和32位的FreeBSD等等。咱們將長期的經驗集於這個小組件,提供統一的數據庫鏈接訪問(如oracle、微軟SQL等等)。這意味着您能夠在您的項目之間輕鬆地切換不一樣的數據庫,以及建立跨數據庫應用程序接口。服務器

兩個表之間的主/細節(MD)關係很是普遍。所以,爲數據庫應用程序開發人員提供一種簡單的方法來使用它是很是重要的。讓咱們研究一下UniDAC是如何實現這一特性的。網絡

假設咱們在「Department」和「Employee」表之間有典型的MD關係。oracle

「Department」表中有字段Dept_No。Dept_No是主鍵。ui

「Employee」表有一個主鍵EmpNo和一個將「Employee」綁定到「Department」的外鍵Dept_No。spa

必須顯示和編輯這些表。code

UniDAC提供了兩種綁定表的方法。第一個代碼示例演示如何經過參數將兩個TCustomUniDataSet組件綁定到MD關係中。component

1orm

2接口

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

procedure TForm1.Form1Create(Sender: TObject);

var

  Master, Detail: TUniQuery;

  MasterSource: TDataSource;

begin

  // create master dataset

  Master := TUniQuery.Create(Self);

  Master.SQL.Text := 'SELECT * FROM Department';

 

  // create detail dataset

 

  Detail := TUniQuery.Create(Self);

  Detail.SQL.Text := 'SELECT * FROM Employee WHERE Dept_No = :Dept_No';

 

  // connect detail dataset with master via TDataSource component

  MasterSource := TDataSource.Create(Self);

  MasterSource.DataSet := Master;

  Detail.MasterSource := MasterSource;

 

  // open master dataset and only then detail dataset

  Master.Open;

  Detail.Open;

end;

注意一點:細節數據集SQL中的參數名必須等於用做細節表外鍵的主數據集中的字段名或別名。打開細節數據集後,始終保留Dept_No字段值等於當前主數據集記錄中的字段值的記錄。

還有一個附加功能:當向細節數據集插入新記錄時,它會自動用從主數據集獲取的值填充外鍵字段。

如今假設明細表「Department」外鍵字段名爲DepLink,而不是Dept_No。在這種狀況下,上面代碼中描述的詳細數據集不會自動填充當前「Department」的DepLink字段。Dept_No插入值。這個問題在第二個代碼示例中獲得解決。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

procedure TForm1.Form1Create(Sender: TObject);

var

  Master, Detail: TUniQuery;

  MasterSource: TDataSource;

begin

  // create master dataset

  Master := TUniQuery.Create(Self);

 

  Master.SQL.Text := 'SELECT * FROM Department';

 

  // create detail dataset

  Detail := TUniQuery.Create(Self);

  Detail.SQL.Text := 'SELECT * FROM Employee';

 

  // setup MD

  Detail.MasterFields := 'Dept_No';   // primary key in Department

  Detail.DetailFields := 'DepLink'; // foreign key in Employee

 

  // connect detail dataset with master via TDataSource component

  MasterSource := TDataSource.Create(Self);

  MasterSource.DataSet := Master;

 

  Detail.MasterSource := MasterSource;

 

  // open master dataset and only then detail dataset

  Master.Open;

  Detail.Open;

end;

在這個代碼示例中,MD關係是使用MasterFields和DetailFields屬性創建的。還要注意,在詳細的數據集SQL中沒有WHERE子句。

要在主數據集導航期間延遲細節數據集的刷新,可使用DetailDelay選項。

這種MD關係能夠是本地的和遠程的,這取決於TCustomDADataSet.Options.LocalMasterDetail選項。若是此選項設置爲True,則數據集使用本地篩選來創建主-細節關係,而不引用服務器。不然,每次在主數據集中選擇記錄時,細節數據集都執行查詢。使用本地MD關係能夠減小服務器調用次數並節省服務器資源。它能夠用於慢速鏈接。CachedUpdates模式只能用於局部MD關係的詳細數據集。當明細表包含的行太多時,不建議使用本地MD關係,由於在遠程MD關係中,只提取與主數據集中當前記錄對應的記錄。所以,在某些狀況下,這能夠減小網絡流量。

相關文章
相關標籤/搜索