其實可以這樣來理解:資料集元件從資料庫中取得資料後,將取得的資料放置到一個緩冲區中,而顯示在程式上的內容正是該緩冲區的內容。緩衝區中有一個指向當前記錄的指標。然後我們通過操作該指標來對資料進行操作,最後再由資料集將操作後的資料儲存給資料庫。
資料集元件有許多相同的屬性和方法,也正是我們平常程式設計中所遇到的,Let’s go,一起來看看吧:
屬性
⑴Active
Active屬性是一個Boolean類型的變數,用來指定資料集元件是否打開,很明顯,屬性爲True時爲打開啦!可以直接對Active賦值,也可以調用Open方法或者Close方法。
⑵Bof,Eof
Bof和Eof反映了當前指標記錄的位置,同樣都是Boolean類型。Bof爲True時,指標指向第一條記錄;Eof爲True時,指標指向最後一條記錄。打開一個資料集時,默認是指向第一條記錄,既Bof爲True。如果資料集裏沒有記錄,那麽Bof和Eof均爲True。
⑶Filtered,FilterOptions,Filter
這3個屬性一般是用來過濾的。
Filtered是一個Boolean類型的變數,當賦值爲True時,讀取資料時就執行過濾條件中的設置。FilterOptions決定篩檢程式的使用方式,它有兩個選項:foCaseInsensitive(大小寫是否敏感),foNoPartialCompare(是否支援通配符*)。Filter決定過濾的條件,是一個字串變數,字串的形式如:欄位名 + 操作值 + 數值。例如:“ID < 100”就是只顯示ID欄位小於100的記錄。該屬性可以在運行時或設計時設置。
⑷Fields,FieldCount
看看Help中對Fields的定義:
property Fields: Tfields
嘿嘿,從中我們可以得知它是一個Tfields物件。通過Fields屬性,我們可以直接訪問資料集中當前指標記錄的某一個欄位,也就是說我們可以將Fields屬性當成是陣列來訪問,通過Fields[序號].AsString的方式來獲得資料(在BCB中爲Fields[序號]->AsString),序號從0開始,一直到FieldCount-1爲止,一共是FieldCount個資料。FieldCount屬性則說明當前記錄有多少個欄位。
例如:Edit1.Text := CustTable.Fields.Fields[0].AsString;(BCB中爲Edit1->Text= CustTable.Fields->Fields[0]->AsString;)
⑸FieldDefs
同樣,打開Help看看:
property FieldDefs: TfieldDefs;
從Help中我們得知,通過FieldDefs屬性可以訪問和設置每個欄位的資料類型,資料長度等相關資訊,當創建新表時FieldDefs屬性爲空。
⑹FieldValues
FieldValues是一個Variant類型的變數,也可以像Fields一樣訪問當前記錄的每個欄位數值。Help中定義如下:
Property FieldValues[const FieldName: String]: Variant; default;
該屬性是以欄位名爲線索訪問欄位值的,可以修改和訪問欄位的數值,欄位名在FieldName中指定,不區別大小寫。由於是Variant的,可以表示所有類型的資料,注意一下,就是爲該屬性賦值時,資料類型和欄位定義的資料類型要一致喲!
⑺RecNo
RecNo是一個Integer類型的變數。通過RecNo屬性可以得知當前指標指向資料集中的第幾條記錄,也可以修改RecNo來使指標跳轉到所要的記錄上去。由於RecNo是一個長整型整數變數,它的值應爲於1至記錄總數之間。如果賦給RecNo的值在此範圍之外,那指標是不會移動的。
⑻RecordCount
RecordCount是一個唯讀的Integer變數,通過它我們可以得到當前資料集的總的記錄數量。
⑼State
State屬性用以說明當前資料集的狀態。通過對State的判斷來決定是否進行指標操作。
⑽CachedUpdates
該屬性指定了資料集是否支援資料表更新操作Cache,True時就表示支援。這樣的好處是對當前資料集中的內容並不立即更新入資料庫,減少資料庫事務次數和網路流量。
經常用到的屬性就是上面這些,讓我們再來看看資料集共用的方法吧:
⑴Append
調用Append方法,是讓資料集進入新增一條記錄狀態,這條記錄是一個空記錄,當前指標也會指向該空記錄,然後就可以向該記錄輸入資料。注意呀,該記錄只是存在于資料集中,並沒有添加到資料庫中,如果想增加到表中,就要調用Post方法。
⑵AppendRecord
看看Help中的原形:
procedure AppendRecord(const Values: array of const);
該方法用來增加一條新記錄。請注意一下它與⑴Append的區別:AppendRecord把新增的記錄中的資料作爲參數。這樣就省掉了調用Append方法後還要賦值的步驟。
⑶Cancel,Post
Cancel用來取消新增,編輯等對資料集修改的操作。Post則是將新增,編輯等操作從資料集中儲存到資料庫。
⑷ClearFields
利用該方法來清除正在編輯的記錄中的所有欄位內容。
⑸Open,Close
打開和關閉資料集的連接,Acitve屬性也會隨之而改變
⑹Edit
該方法是使資料集進入編輯狀態,被編輯的是當前狀態。注意一下,如果在進行編輯等操作時,不是可編輯狀態,會觸發異常。那就需要用Edit方法來進入編輯狀態。(這句話好象說了等於沒說一樣)
⑺ApplyUpdates,CancelUpdates,CommitUpdates,RevertRecord
這4個有一個共同點:將對資料的操作放入Cache中,在最後才一起儲存到資料庫中,還支援對資料庫操作的撤消。
★ ApplyUpdates:是將對資料集的操作添加到操作緩衝區中,不是儲存到資料庫中哦!調用該方法可以檢查這個操作是否符合資料庫的規則,如果剛才的操作不合法將會觸發異常。這時可用資料庫的RollBack方法撤消操作,也可以通過CancelUpdates來撤消操作。
★ CancelUpdates:將Cache中的更新撤消
★ CommitUpdates:將Cache中的所有更新全部儲存到資料庫,這個操作是最終的,不可挽回,請留意呀!
★ RevertRecord:撤消剛才對當前記錄的操作。
使用時上面4個方法時,CachedUpdates屬性必須爲True。
⑻FetchAll
該方法用來解決當需要減少與遠端資料庫之間的書記流量的傳遞。其實它是先把緩衝區中的對資料庫更新的操作儲存到資料庫,再從資料庫中取得當前記錄到最後一條記錄的資料,嘿嘿,這樣不是就減少了網路流量了呀!
⑼FieldByName
用該方法通過欄位名訪問資料集當前記錄的某個欄位。這個方法和通過FieldValues屬性類似。不過FieldByName只能用來得到欄位的值而不能賦值,而且FieldByName返回一個Tfield物件,除了能得到數值以外,還有欄位資訊.。該方法使用頻率很頻繁,從站內的帖子中可以看得出來。
⑽FindFirst,FindNext,FindPrior,FindLast
這4個方法是用來查找符合過濾規則的記錄的。
★ FindFirst:查找第一條符合規則的記錄
★ FindNext:查找從當前記錄開始的下一條符合規則的記錄
★ FindPrior:查找從當前記錄開始的上一條符合規則的記錄
★ FindLast:查找最後一條符合規則的記錄
⑾First,Next,Prior,Last
這4個方法是用來移動在資料集中指向記錄的指標。
★ First:將指標移動到第一筆指標
★ Next:將指標從當前記錄移動到下一條記錄
★ Prior:將指標從當前記錄移動到上一筆記錄
★ Last:將指標移動到最後一筆記錄
⑿Lookup
該方法用來收索符合一定條件的記錄,如果知道符合的記錄就返回指定欄位的數值。該方法有3個參數:
★ KeyFields:用來指定搜索的欄位,可以是一個或者多個欄位名,中間用分隔號隔開。
★ KeyValues:由於類型是Variant類型,可以包含任何資料類型,它指定了搜索欄位要符合的數值,如果要用來指定多個搜索欄位,那麽KeyValues參數需要用VarArrayOf函數生成Variant類型陣列
★ ResultFields:當找到符合的記錄,返回的欄位由該參數指定,同樣可以是一個或者多個欄位。留意哦,該參數也是Variant類型哦!
⒀Locate
和上面的⑿Lookup方法類似,也是用來搜索指定條件的記錄。
不同的地方在於Locate並不返回任何數值,而只是將指標移動到符合條件的記錄上去,Lookup則不會移動指標。
Locate中的參數KeyFields參數和KeyValues參數於Lookup中的意義一樣。需要注意的是Options是一個集合,它指定了查找的方式。它包括了兩個選項:loCaseInsensitive和loPartialKey。前者是對大小寫不敏感;後者是部分匹配。
⒁Insert,InsertRecord
這2個方法用來在當前記錄之前插入一條記錄。
它們的使用方式與⑴Append,⑵AppendRecord等方法類似,Insert方法可以讓資料集進入插入一條記錄狀態,在資料集中會新增一條空記錄,當前記錄指標也指向這條空記錄,用戶可以向這個記錄中輸入數值。這個記錄只是存在于資料集中,如果想增加到資料庫中去,就要使用Post方法。而InsertRecord方法則是直接把新增的記錄中的資料作爲參數。這樣就省掉了調用Insert方法後還要賦值。
⒂MoveBy
用來移動資料集中的指標,和設置RecNo屬性類似。不過MoveBy是相對的移動,而RecNo則是絕對的移動。
⒃Refresh
該方法將從資料庫中重新取得資料並刷新資料集,將保持刷新前指標的位置,但不保證完全不變,因爲有可能該記錄在刷新後已被刪除掉了。
⒄SetFields
該方法使資料集處於編輯狀態,可以一次性將所有欄位的資料添入當前記錄。
利用紅色的關鍵字在站內搜索,您可以得到更詳細的用法,我就不再畫蛇添足了!