ClientDataSet組件支持很多特性,其中一些與三級結(jié)構(gòu)有關(guān),而且還可以用在其他環(huán)境中。該組件說明了一個數(shù)據(jù)庫完全映象在內(nèi)存中,這使得可以進(jìn)行動態(tài)的操作,如建立一個索引,其他數(shù)據(jù)集合通常不支持該特性。例如,為了對查詢分類,我們通常是重新執(zhí)行它。為了索引一個局部表格,需要定義索引。只有ADO數(shù)據(jù)集合有一些與ClientDataSet一樣的動態(tài)索引功能。
索引并不是ClientDataSet提供的全部功能。當(dāng)我們擁有了索引之后,可以基于它定義組,可能是多級別的分組。對于確定一個記錄在組中的位置(頭、尾或中間位置),甚至有專門的支持。在組或整個數(shù)據(jù)表格中,我們可以定義總計;也就是說,可以動態(tài)計算整個表格或當(dāng)前組中一列的總和或平均值。數(shù)據(jù)不需要發(fā)送給物理服務(wù)器,因為這些總計操作發(fā)生在內(nèi)存中。我們甚至可以定義新的總計字段,可以直接與數(shù)據(jù)敏感控件相連。
注意,所有這些特性不但可以用與MIDAS應(yīng)用程序,還可以用與客戶機(jī)/服務(wù)器,甚至是局部瘦應(yīng)用程序。事實上,ClientDataSet組件可以從遠(yuǎn)程MIDAS連接、局部數(shù)據(jù)集合(建立起數(shù)據(jù)的快照)、或局部文件(就象在公文包模式中一樣,但使用的只是在客戶機(jī)數(shù)據(jù)集合中定義的整個表格)中獲得起數(shù)據(jù)。
這是另一個需要研究的領(lǐng)域,所以將向讀者演示兩個范例來突出關(guān)鍵特性。這些范例沒有基于MIDAS,而是基于局部表格。
1、定義抽象的數(shù)據(jù)的數(shù)據(jù)類型 VCL數(shù)據(jù)庫支持的一個有趣的特性是,當(dāng)我們基于局部文件使用ClientDataSet時,可以定義抽象的數(shù)據(jù)類型。只需在窗體上放置一個ClientDataSet組件,為FieldDefs屬性激活編輯器,添加兩個字段,并為他們的DataType屬性選擇ftADT值?,F(xiàn)在,移到ChildDefs屬性,并定義子字段,下面是AdtDemo范例的字段定義:
FieldDefs = <
item
Name = \'ID\'
DataType = ftInteger
end
item
name = \'Name\'
ChildDefs = <
item
name = \'LastName\'
DataType = ftString
size = 20
end
item
name = \'FirstName\'
datatype = ftString
size = 20
end>
datatype = ftADT
size = 2
end>
在此,只需為ClientDataSet的FileName屬性輸入一個名稱,用鼠標(biāo)右鍵單擊組件,并選擇Create Table命令即可;我們準(zhǔn)備編譯并運行應(yīng)用程序(在向它連接數(shù)據(jù)敏感組件之后)。數(shù)據(jù)會自動從提供的文件中讀取,關(guān)閉程序時會將變化保存在文件中。
如果使用DBGrid查看結(jié)果數(shù)據(jù)集合,它允許我們展開或壓縮ADT字段的子字段。我們可以通過定義字段的OnGetText事件提供它的壓縮值(在Delphi4 中有一個缺省值,但Delphi5中沒有):
procedure TForm1.ClientDataSet1NameGetText(Sender:TField;
var Text:String;DisplayText:Boolean);
begin
Text:=ClientDataSet1NameFirstName.AsString+\' \'+
ClientDataSet1NameLastName.AsString;
end;
2、動態(tài)索引
一旦ClientDataSet上有了數(shù)據(jù),數(shù)據(jù)就已全部處于內(nèi)存中了。當(dāng)我們將組件基于局部文件中時(如在AdtDemo范例中),在程序啟動時整個文件就被裝載到了內(nèi)存總。這與從Paradox數(shù)據(jù)表格中裝載數(shù)據(jù)(BDE只裝載正訪問的字段)不同。
將整個表格裝在內(nèi)存中的優(yōu)點是,我們可以快速地對它進(jìn)行分類。使用ClientDataSet組件,我們可以通過賦給IndexFieldNames屬性相應(yīng)的字段名來實現(xiàn)分類。在AdtDemo(以及很多程序)中,該索引變動會在單擊DBGrid控件的標(biāo)題(觸發(fā)OnTitleClick事件)時執(zhí)行:
procedure TForm1.DBGrid1TitleClick(Column:TColumn);
begin
if Column.Field.FullName = \'Name\' then
ClientDataSet1.IndexFieldNames := \'Name.LastName\'
else
ClientDataSet1.IndexFieldNames := Column.Field.FullName;
end;
由于ADT定義,程序使用了字段的FullName屬性(而不是FieldName屬性)。事實上,對于子字段來說,索引應(yīng)該基于Name.LastName,而不是LastName。而且ADT字段不能自己被索引,所以如果選擇它,程序會使用LastName子字段作為索引。這些索引不是持久性的;它們沒有保存在文件中,而只是在內(nèi)存中應(yīng)用于數(shù)據(jù)。
技巧:ClientDataSet可以擁有基于計算字段的索引,特別是內(nèi)部計算字段,這種字段類型只能用于該數(shù)據(jù)集合。
來源:考試大-計算機(jī)二級考試