三、 ADODataset組件
ADODataset是ADO組件中最通用的一個(gè)組件,它能獲取并代表任何其他ADO組件從數(shù)據(jù)庫(kù)返回的數(shù)據(jù)集合。數(shù)據(jù)集是通過(guò)SQL命令返回的一個(gè)表或者多個(gè)表數(shù)據(jù)。
要使ADODataset數(shù)據(jù)集組件能夠正常地發(fā)揮作用,則應(yīng)首先設(shè)置其Connection或Connection String屬性來(lái)建立起到數(shù)據(jù)庫(kù)的連接。如果要使用一個(gè)RDSDataSpace對(duì)象將該數(shù)據(jù)集連接到基于ADO的應(yīng)用程序服務(wù)器,則需要RDSConnection屬性設(shè)置為一個(gè)TRDSConnection對(duì)象。
由于ADODataset組件必須返回一個(gè)結(jié)果集,所以其CommandText屬性中如果使用語(yǔ)句,則只能使用SELECT語(yǔ)句,而不能使用一引起數(shù)據(jù)操作語(yǔ)言(DML),比如DELETE、INSERT和UPDATE語(yǔ)句。
同時(shí)由于該數(shù)據(jù)集可以使用SQL 語(yǔ)句。所以可以從一個(gè)或多個(gè)基表中查詢(xún)數(shù)據(jù)。
? ADODataset的常用屬性
1) Active
指示當(dāng)前的記錄集是否處于打開(kāi)狀態(tài),調(diào)用open方法,打開(kāi)數(shù)據(jù)庫(kù),Active值為T(mén)rue;調(diào)用close方法,數(shù)據(jù)庫(kù)關(guān)閉,則Active為False;
只有Active的值為False時(shí),應(yīng)用程序才能對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě)操作。需要將Active變?yōu)門(mén)rue的情況是:
v 數(shù)據(jù)庫(kù)的狀態(tài)設(shè)為dsBrowse(瀏覽模式、查看、掃描數(shù)據(jù))。
v 如果程序中加載了BeforeOpen事件,在該事件被觸發(fā)時(shí)。
v 如果程序加載了AfterOpen事件,在該事件被觸發(fā)時(shí)。
v 通過(guò)記錄集打開(kāi)一個(gè)數(shù)據(jù)指針時(shí)。
在更改數(shù)據(jù)集屬性,且這些屬性影響到數(shù)據(jù)庫(kù)的狀態(tài)或數(shù)據(jù)顯示組件的狀態(tài)時(shí),要提前將數(shù)據(jù)集的Active屬性設(shè)置為False;
2) AutoCalcFields
設(shè)為T(mén)rue,則允許應(yīng)用程序觸發(fā)On
v 數(shù)據(jù)集組件的狀態(tài)變?yōu)閐sEdit。
v 記錄已經(jīng)被修改。
v 應(yīng)用程序從數(shù)據(jù)庫(kù)中重新獲得一條記錄。
可以看出,上述的情況并不都需要更新計(jì)算字段。如果用戶(hù)需要頻繁地修改數(shù)據(jù),則On
3) Cachesize
指定數(shù)據(jù)集的緩沖區(qū)大小。數(shù)據(jù)集首先把數(shù)據(jù)從數(shù)據(jù)庫(kù)中取出,然后保存在內(nèi)存的一塊域中。這塊內(nèi)存區(qū)域就是所謂的緩沖區(qū)。如果設(shè)置CacheSize為20,則表示數(shù)據(jù)集將一次從數(shù)據(jù)集將一次從數(shù)據(jù)庫(kù)中提取20條記錄并將這20條記錄保存到緩沖區(qū)中。缺省值為1,也是最小值。
4) CommandText
指定數(shù)據(jù)集合中包含的命令,可以是SQL語(yǔ)句,一個(gè)表名或者一個(gè)存儲(chǔ)過(guò)程名。常用的調(diào)用形式為:
with ADODataset1 do
begin
commandType:=cmdText;
command Text:=’Select * From customerTable’;
open;
end;
5) Filer
數(shù)據(jù)集的過(guò)濾器,通過(guò)使用過(guò)濾器可以把那些不需要的數(shù)據(jù)過(guò)濾掉。設(shè)置Filter屬性的典型方法為:
with ADODataset1 do begin
Filterd:=False;
Filter:=’State=’+Quotedstr(‘CA’)+’OR’+”State=’+Quotedstr(‘CA’);
Filterd:=True;
End;
如果用戶(hù)修改了帶有過(guò)濾數(shù)據(jù)集的數(shù)據(jù),修改的結(jié)果如果不滿(mǎn)足過(guò)濾器的條件,則修改的數(shù)據(jù)就自動(dòng)從當(dāng)前的數(shù)據(jù)庫(kù)中消失。
6) MaxRecord
最大 返回?cái)?shù)據(jù)集記錄數(shù),默認(rèn)值為0 返回所有數(shù)據(jù)。
7) RecordCount
顯示與數(shù)據(jù)集相連的記錄的總數(shù)
詳細(xì)的屬性大家可以看最后一頁(yè)
ADODataset的常用方法
1) GetIndexNames(List:Tstring)
查詢(xún)表中的全部索引,返回值將保存在參數(shù)List中,調(diào)用方法為:
ADODataset1.GetIndexNames(ListBox1.Items);
2) DeleteRecords(AffectRecords:TaffectRecords=arAll)
刪除記錄集的記錄,參數(shù)AffectRecords用于指定要?jiǎng)h除的具體記錄。它的取值可為如下:
AffectRecords的參數(shù)及說(shuō)明
參數(shù)值 說(shuō)明
arCurrent 僅刪除當(dāng)前記錄
arFiltered 刪除滿(mǎn)足過(guò)濾器過(guò)濾條件的數(shù)據(jù)
arAll 刪除記錄的所有記錄
arAllChapters 刪除ADO連接數(shù)據(jù)部分的全部記錄
缺省值為arAll,刪除當(dāng)前記錄集中的所有記錄。
3) Locate(const KeyFields:String;constKeyValues:Variant;Options:TLocateOptions)
定位一條記錄并把這條記錄作為當(dāng)前記錄。其中KeyFields是索引的字段名;KeyValues是要查找的值;Options是定位數(shù)據(jù)選項(xiàng),他的值可以是:
v IoCaseInsensitive:定位數(shù)據(jù)不區(qū)分大小寫(xiě)。
v IoPartialkey:部分匹配定位查找數(shù)據(jù)。
4) Requery(options:TexecuteOption=[])
刷新數(shù)據(jù)集中的數(shù)據(jù),它是通過(guò)重新執(zhí)行原來(lái)的命令或SQL語(yǔ)句來(lái)重新生成記錄集。
5) SaveToFile(constFileName:String=’’;Format:TpersisFormat=PftAdTg)
把當(dāng)前數(shù)據(jù)集中的數(shù)據(jù)按照指定的格式保存到指定的文件中。FileName為指定的文件名:Format為保存的文件格式,它可以選取下列值:
v PfAdTG:按照ADTG(Advanced Da
v PfXML:按照XML格式保存文件。
6) seek(constKeyValues:Variant;seekOption:Tseekoption=SoFirstEQ)
搜索記錄并移動(dòng)數(shù)據(jù)集的指針。搜索動(dòng)作是以當(dāng)前數(shù)據(jù)集中的索引為搜索依據(jù)。其中KeyValues為被搜索的值。
Success:=ADODataSet1.seek(‘Jones’,SoFirstEQ);
如果搜索到復(fù)合索引的值,則返回True,反之為False,也可以同時(shí)搜索多個(gè)值:
ADODataSet1.seek(VarArrayof([90030,90020]),soFirstEQ);
這就需要利用函數(shù)VarArrayof()構(gòu)造一個(gè)參數(shù)傳遞給KeyValues。
Seek的第二個(gè)參數(shù)seekoption限定了搜索行為的動(dòng)作。
可以取的值如下:
Seekoption的取值及說(shuō)明
參數(shù)值 說(shuō)明
SoFirstEQ Rexord 數(shù)據(jù)庫(kù)指針定位在第一條匹配的記錄處,如果沒(méi)有任何匹配記錄則指向數(shù)據(jù)庫(kù)的未記錄
SoLastEQ Record 數(shù)據(jù)庫(kù)指針定位在最后一條匹配的記錄處,如果沒(méi)有任何匹配記錄則指向數(shù)據(jù)庫(kù)的未記錄
SoAfterEQ Record 如果搜索到匹配記錄,在指向匹配記錄的下一條,如果沒(méi)有找到則指向最近似匹配記錄上
SoAfter 指向匹配記錄的下一條
SoBeforeEQ 如果搜索到匹配記錄,在指向匹配記錄的前一條,如果沒(méi)有找到則指向最近似匹配記錄上
SoBefore 指向匹配記錄的前一條