您好,登錄后才能下訂單哦!
一、DataSource的兩個主要作用:
1、連接數據集和數據感知控件
2、連接兩個存在數據關系的數據集(比如數據要一起聯動,或者兩個數據集本身就是主從關系)
這時從數據集的DataSource要設置為指向主數據集的DataSource組件
二、兩個數據集設置主從方式(針對ADO控件,因為FireDAC的Dataset沒有datasource屬性)
假設有兩個表,teacher和student表,結構及數據如下,可以看出,一個老師有多個學生,student表通過teacherid與teacher表連接(也可以把兩個表看成是主從關系)。
teacher表:
ID?????????????? TeacherName
1???????????????????? alex
2??????????????????? miley
3???????????????????? joana
4????????????????????? BBQ
Student表:
ID????????? StudentName??????? TeacherID
1???????????????? john????????????????????????? 1
2??????????????? stephen???????????????????? 1
3????????????????? ooo???????????????????????? 1
4???????????????? ABC?????????????????????????? 2
5????????????????? EFG???????????????????????? 2
6???????????????? kathy????????????????????? 3
7????????????????? steph????????????????????? 4
1、參數方式
兩個數據集需要聯動時,可以在SQL語句中使用參數的方式。
(1)dataset1的語句是select * from teacher
(2)datasource1的dataset設置為dataset1
(3)dataset2的語句是select * from student where teacherid = :id (:id說明了需要接收id參數)
(4)dataset2的datasource屬性設置為datasource1
這樣就完成了聯動設置,當dataset1的記錄變化時,由于dataset2的datasource是datasource1,所以能夠接收到dataset1傳過來的新的id參數。因此dataset2的記錄也會根據dataset1的id不同而變化。
2、設置范圍方式(巢狀數據)
這種方式不需要寫代碼,通過組件配置就可以實現。
(1)dataset1的語句是select * from teacher
(2)datasource1的dataset設置為dataset1
(3)dataset2的語句是select * from student (這里不需要接收任何參數)
(4)dataset2的datasource屬性設置為datasource1
(5)點擊dataset2的masterfields的省略號,在彈出設置框中設置關聯關系
這樣dataset1和dataset2的主從關系就已經設置好了。
三、FireDAC設置主從關系
詳細英文頁面:http://docwiki.embarcadero.com/RADStudio/Rio/en/Master-Detail_Relationship_(M/D)
FireDAC設置主從也有兩種方式(實際上對應ADO的兩種方式):
1、基于參數的方式。和ADO的參數方式差不多,可用于 TFDQuery 或者 TFDStoredProc(只能用在這兩個控件上),主從是通過重新查詢實現。
2、基于范圍的方式。可以用于所有FireDAC的數據集控件,它是通過設置范圍的方式來實現,同時需要設置從表的IndexFieldName。(這個索引表示數據按哪個列來排列)
Feature????????????????????????????????????????????????????????????????????????????????????????????????????????? Parameter-based???????????????? Range-based
The detail query returns a limited number of records.???????????????????????????????????? +
The detail records are fresh.????????????????????????????????????????????????????????????????????????????????? +
Reduced traffic and DBMS workload on each master change.???????????????????????????????????????????????????????????????????? +
The cached updates preserved on the master change.???????????????????????????????????????????????????????????????????????????????? +
Works in offline mode.??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? +
Supports Centralized Cached Updates with propagation???????????????????????????????????????????????????????????????????????????? +
同時,FireDAC也有兩種緩存更新方式:
1、非集中式更新。主從表各自保存各自的緩存
2、集中式的更新。主從表共享同一份更新日志,可以做到更好的控制,實現級聯更新,以及實現自增值等。(個人覺得,集中式的更新,共享更新日志,是ClientDataset可以對接主表,形成巢狀數據庫的關鍵,因此巢狀數據在這種方式下才能形成,不管是ADO還是FireDAC)
1、參數方式:
與ADO相同,區別在第(4)步,是將從表的MasterSource指向主表(ADO中是Datasource)。同時,可以選擇是否設置MasterField字段,如果設置了就按照設置,不設置就按參數同名的字段。
2、范圍方式:
前面步驟與ADO的方式相同,從第(4)步開始:
(4)dataset2的MasterSource屬性設置為datasource1
(5)點擊dataset2的masterfields的省略號,在彈出設置框中設置關聯關系。同時設置IndexFieldNames字段(重要)
注:在從表里,MasterSource、MasterField里,指的都是主表,即關聯到主表的datasource、主表的聯接字段。
四、ClientDataSet主要作用:
1、作為獨立的、與數據庫無關的、全功能的內存數據集,實現大部分數據存儲和操作功能,這時它就相當于單層數據庫
2、作為多層數據庫的客戶端,連接本層或者中間層的provider控件(如果連接的不是本層的provider,則需要用DCOMConnect去連中間層),再由provider連接DataSet
3、存儲具有主從關系的巢狀數據集
五、ClientDataSet設置巢狀數據庫
用ClientDataSet設置巢狀數據庫,前提是ado組件(或其它table類組件)已經構建好了主從關系(如第二步第2點所述。
(1)放置TProvider組件,Dataset屬性設置成dataset1(即主從關系的主表)
(2)將clientdataset1的providername設置成provider1,將active設置為true,可以看到,clientdataseet1已經將主從關系表數據都取回來了。其中主表數據正常顯示,從表數據用一個字段表示,字段名一般為從表組件名,在這個示例中是adodataset2
(3)雙擊clientdataset1,彈出字段編輯器,然后點add all fields,這樣就自動生成了所有字段。在單層的程序中,這一步是必要的,因為沒有應用服務的connection提供信息,所以如果不手工增加一下字段信息的話,第(4)步就無法選擇也無法輸入巢狀字段名,會報無效的字段。
(4)將clientdataset2的datafield字段設置為clientdataset1的那個包含從表數據的字段,在本例中是adodataset2字段。這時巢狀數據關系就已經設置好了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。