oracle 10g---記錄集

記錄集是從數據庫中按一定查詢條件讀入到內存中的一批記錄,以供快速的操作。
記錄集recordset對象的屬性,方法:
BOF:當記錄集記錄指針指到起始記錄(第1條記錄)再向前移(即超過第1條記錄),這時返回true.常用來對付一些出錯情況。注:在BOF或EOF時使用update方法會出錯。
EOF:當記錄指針指到最後一條記錄之後(即超過了最後1條記錄)時,該屬性返回true.注:當一個記錄集爲空時,其BOF和EOF屬性都爲True,可據此檢測一個記錄集是否爲空。
AbsolutePosition:返回當前記錄指針,即當前記錄是第幾條記錄,只讀。
BookMark: 設置/返回當前記錄指針的書籤,爲字符串。如:
在當前記錄處設置書籤:lxn=Adodc1.Recordset.BookMark
當指針移動後回到指定書籤位置:Adodc1.Recordset.BookMark=lxn.
返回記錄集中記錄的總數:RecordCount屬性。該屬性對於表形式的記錄集將返回精確數目,但對於僅向前型記錄集(adOpenForwardOnly),返回-1。動態記錄集(adOpenDynamic)則不一定,可能返回-1,與記錄集的CursorLocation有關;而對於靜態記錄集(adOpenStatic),也總能返回精確數目。附:在DAO中,對動態集和快照集需要先用MoveFirst和Movelast方法,再用RecordCount取得記錄精確數目。
Move方法:移動記錄集指針。該方法有兩個參數,第一個參數指定要向前或向後移動多少條記錄,第二個參數指定一個相對書籤位置,表明從當前記錄還是從第1條或最後1條記錄開始算,缺省爲0從當前記錄開始移,將指針從當前位置向前(負數)或向後(正數)移動指定條記錄(第二個‘按書籤移動’參數設爲0-adBookMarkCurrent從當前記錄開始,缺省)或將指針從第1條記錄算起移動指定條記錄(第二個參數設爲1-adBookMarkFirst從首記錄)。或將指針從最後1條記錄算起移動指定條記錄(第二個參數設爲adBookMarkLast),如:Adodc1.Recordset.Move -12,將指針從當前位置向前移動12條記錄,再如Adodc1.Recordset.Move 6 , 1表示指針從首記錄開始後移6條記錄,即使指針移到第7條記錄。Move方法有幾個引申的方法,如下:
movefirst,記錄集指針移到第1條記錄;
movelast,記錄集指針移到最後1條記錄;
moveprevious,記錄集指針移到上一條記錄;
movenext,記錄集指針移到下一條記錄。
Find方法:查找滿足條件的記錄。
find方法簡略格式爲:
adodc對象.recordset.find 查找表達式(爲“字段 比較符號 值”)
其他參數採用缺省,find工作方式是:從當前記錄指針位置開始(含當前記錄)向後逐條檢索記錄,遇到滿足條件的1條記錄就停下來,指針指到此記錄。
因此,若要實現“繼續尋找下1個”的功能,只要將記錄指針移到下1條記錄(用movenext一下),再照原樣使用find即可。 而重新查找必須先用movefirst將指針指到開頭。 
Adodc1.Recordset.find "姓名 = '李長春'" 
其中查找表達式的樣子爲“字段 比較符號 值”,比較符號不僅可以是等號,還可以是>,<,<=,>=,<>,like等。其中Like和 = 很相近,只不過like專用於字符串比較,不區分字母的大小寫可用通配符,而 = 號會區分字母大小寫不能用通配符。
一般情況下,查找表達式常採用變量表示,由用戶來確定,如下:
Dim lxn As String
Static a As String 
a = InputBox("請輸入查找姓名","查找") 
lxn = "NAME like '" & a & "'"
.Find lxn 

LockType屬性:設置記錄集中的記錄鎖定方式,是否可修改及修改方式:有1-adLockReadOnly(只讀);2-adLockPessimistic(保守式修改),當修改記錄後立即將更改保存到數據源,3-adLockOptimistic(開放式修改),當修改記錄後只有調用Update方法纔將更改保存到數據源;4-adLockBatchOptimistic(開放式批處理修改)。當修改記錄後只有調用UpdateBatch方法纔將更改保存到數據源。對於ADO對象而言,該屬性的缺省值爲1-adLockReadOnly只讀,要編輯記錄則必須加以改變。 
Update方法:對記錄集當前記錄的更改進行保存到數據庫。
UpdateBatch方法:成批保存更改的多條記錄。只有當記錄集使用鎖定方式爲adLockBatchOptimistic打開時該方法纔有效。使用該方法,可以加快更新速度。因爲一條一條更新的話,速度慢,而多條一起更新的話,其實等同於一個更新操作,因此更快。該方法有個可選參數AffectRecords提一下,它可設爲:adAffectCurrent只更新當前記錄;adAffectGroup只更新當前Filter屬性滿足的記錄;adAffectAll(缺省)全部更新,包括被當前Filter屬性隱藏的記錄。
CancelUpdate方法:放棄保存對當前記錄自上次Update後的更改,即不保存當前所作的修改。通常在WillChangeRecord事件中進行數據驗證時用。當然一般是直接將事件提供的參數adStatus設爲adStatusCancel即可取消保存。這裏要注意,在WillChangeRecord事件中取消一個操作,將發生“操作已取消”的錯誤。照我的感覺,還不如直接在要Update的代碼前面去驗證輸入的數據。
在記錄集中添加新記錄,用addnew方法先在緩存中添加一個新的空記錄,這時它自動成爲當前記錄,通過修改,然後用update方法保存,data1.recordset.update,說明:如果用Movenext等方法將記錄指針移開時記錄集會自動保存緩存中的記錄(等於調用Update方法)。
修改當前記錄,只要直接給字段賦值就可以了,注意賦值後也要用Update方法將緩存中的數據保存,否則不會自動更新,除非用MoveNext等方法將指針移開讓它自動調用。 
刪除當前記錄用Delete方法就行了。有一點要注意,刪除後,記錄指針仍在被刪除的記錄上,因此要用MoveNext等方法將指針移開,或乾脆Requery刷新一下。
Sort:指定用來對全部記錄排序的參照字段。
Fields:包含記錄集中各字段的集合。指定某個字段格式爲:fields("字段名")。可省略。如有:m$=data1.recordset.fields("姓名").value爲讀當前記錄(用value表示)的“姓名”字段值。還可用來在代碼中修改(寫)記錄值(不是用綁定控件),如修改記錄值爲“李新能”:data1.recordset.fields("姓名").value="李新能"。也可寫爲data1.recordset("姓名").value,括號內寫明字段名或“字段索引值”,第1個字段索引值從0開始。如data1.recordset(0).value.
關閉記錄集用close方法,格式爲“記錄集.close”。
要讀或寫當前記錄的某個字段值,只要用“記錄集("字段名")”就可以了,Fields和Value都是缺省屬性,但當值是一個記錄集的除外,如數據環境中Command命令對象的子命令對象。
刷新記錄集(即重新打開記錄集):Requery方法。在記錄集打開的情況下,迅速關閉又打開一次,以達到確保記錄集始終處於激活狀態。
返回/設置記錄集當前編輯狀態:EditMode屬性。有以下三個可能返回值:adEditNone沒有編輯;adEditInProgress正在編輯(即當前記錄已修改但未保存);adEditAdd已經用AddNew方法添加新記錄但還未存盤,在緩存中的是新記錄。這個屬性通常用來檢測某些操作狀態,比如可在窗體的Unload事件中防止修改了的記錄未保存就卸載。
★ AbsolutePage屬性:指定當前記錄所在的頁。其值的範圍在1—PageCount值之間,所謂頁,是把Recordset對象按PageSize爲標準分爲若干頁面,每一頁(除最後一頁)記錄數相等(等於PageSize)。有三個特殊值:adPosUnkown未知位置;adPosBOF在文件頭;adPosEOF在文件尾。
★ ActiveCommand:屬性:只讀屬性。返回關聯的Command對象,如果記錄集不是由Command對象創建的,則返回Null.
★ ActiveConnection屬性:設置/返回記錄集基於哪個Connection對象,如果沒有Connection對象,則直接指定一個連接字符串。
★ Cancel: 取消執行異步 Execute(對Connection和Command對象而言) 或 異步Open 方法調用(即通過 adAsyncConnect、adAsyncExecute 或 adAsyncFetch 參數選項調用這些方法)。
★ CacheSize屬性:本地內存緩存的大小。
★ CancelBatch方法: 取消批更新模式下記錄集中所有還未執行的更新。
★ Clone方法:複製一個記錄集。格式:Set 記錄集變量=記錄集.Clone [adLockReadOnly]當指定可選參數adLockReadOnly表示創建只讀的記錄集副本。使用 Clone 方法可創建多個 Recordset 對象副本,這對於希望在給定的記錄組中保留多個當前記錄十分有用。使用 Clone 方法比使用與初始定義相同的定義創建和打開新 Recordset 對象要有效得多。新創建副本的當前記錄將設置爲首記錄。無論遊標類型如何,對某個 Recordset 對象所作的修改在其所有副本中都是可見的。不過一旦在原始 Recordset 上執行了 Requery,副本將不再與原始 Recordset 同步。關閉原始 Recordset 時並不關閉它的副本,而關閉某個副本也將不關閉原始 Recordset 或任何其他副本。用戶只允許複製支持書籤的 Recordset 對象。書籤值是可交換的,也就是說,來自一個 Recordset 對象的書籤引用可引用其任何副本中的相同記錄。
★ CompareBookmarks: 比較兩個書籤並返回它們相差值的說明。即誰先誰後。
★ CursorLocation: 設置或返回遊標服務的位置。遊標:可以簡單理解爲指向若干行的指針。有三種設置值:adUseNone 沒有使用遊標服務。(該常量已過時並且只爲了向後兼容纔出現,通常不用)。adUseClient 使用由本地遊標庫提供的客戶端遊標,通常使用這種遊標。adUseServer 使用數據提供者的或驅動程序提供的遊標。
該屬性應在建立連接之前設置,更改 CursorLocation 屬性不會影響現有的連接。
遠程數據服務用法 當用於客戶端 (ADOR) Recordset 或 Connection 對象時,只能將 CursorLocation 屬性設置爲 adUseClient。
★ CursorType: 指示在 Recordset 對象中使用的遊標類型。AdOpenForwardOnly 僅向前遊標,默認值。除了只能在記錄中向前滾動外,與靜態遊標相同。當只需要在記錄集中單向移動時,使用它可提高性能。 
AdOpenKeyset 鍵集遊標。儘管從您的記錄集不能訪問其他用戶刪除的記錄,但除無法查看其他用戶添加的記錄外,鍵集遊標與動態遊標相似。仍然可以看見其他用戶更改的數據。 
AdOpenDynamic 動態遊標。可以看見其他用戶所作的添加、更改和刪除。允許在記錄集中進行所有類型的移動,但不包括提供者不支持的書籤操作。 
AdOpenStatic 靜態遊標。可以用來查找數據或生成報告的記錄集合的靜態副本。另外,對其他用戶所作的添加、更改或刪除不可見。 
說明:使用 CursorType 屬性可指定打開 Recordset 對象時應該使用的遊標類型。Recordset 關閉時 CursorType 屬性爲讀/寫,而 Recordset 打開時該屬性爲只讀。
如果將 CursorLocation 屬性設置爲 adUseClient 則只支持 adOpenStatic 的設置。
★ Filter屬性:過濾器。對記錄集進行篩選,返回記錄集中滿足條件的所有記錄,該屬性指定一個篩選字符串,爲一個“字段-比較符號-值”的條件表達式,當該屬性賦值後,記錄集立即變成篩選後的方式,包括如 AbsolutePosition、AbsolutePage、RecordCount 和 PageCount等屬性都將改變,“變”成了一個“新”記錄子集,當前記錄移動到記錄子集的第一個記錄。而當清除 Filter 屬性後,記錄集立即恢復,當前記錄位置將移動到原Recordset 的第一個記錄。
關於“字段-比較符號-值”的說明:“字段” 必須爲 Recordset 中的有效字段名。如果字段名包含空格,必須用方括號將字段名括起來。
“比較符號”必須使用的操作符爲:<、>、<=、>=、<>、= 或 LIKE。
“值” 是用於與字段值(如 'Smith'、#8/24/95#、12.345 或 $50.00)進行比較的值。字符串使用單引號而日期使用井號 #(注:在SQL中不用#號),對於數字,可以使用小數點、貨幣符號和科學記數法。如果 “比較符號” 爲 LIKE,“值” 則可使用通配符。ADO和SQL只允許使用下劃線(_) 和百分號 (%) 通配符,而且必須爲字符串的尾字符。DAO只允許使用問號(?)和星號(*)作通配符.“值” 不可爲 Null。在 LIKE 子句中,可在樣式的開頭和結尾使用通配符(如 LastName Like '*mit*'),或者只在結尾使用通配符(如,LastName Like 'Smit*')
Filter屬性還有幾個特殊值可供選擇:AdFilterNone 刪除當前篩選條件並恢復查看所有記錄。同空字符串””。 AdFilterPendingRecords 允許只查看已更改且尚未發送到服務器的記錄。只能應用於批更新模式。 AdFilterAffectedRecords 允許只查看上一次 Delete、Resync、UpdateBatch 或 CancelBatch 調用所影響的記錄。 AdFilterFetchedRecords 允許查看當前緩衝區中的記錄,即上一次從數據庫中檢索記錄的調用結果。 AdFilterConflictingRecords 允許查看在上一次批更新中失敗的記錄。
★ GetRows方法: 將Recordset的多個記錄值複製到數組中,應當先定義一個變體變量,然後將GetRows的返回值賦給它,這個變量就成了一個二維數組,其第一維下標標識原所在的列(字段),第二維下標標識原所在的行(記錄),每一個交叉點就是一個值了,如:
Dim VariData As Variant
VariData = DataEnvironment1.rsCommand1.GetRows
x = UBound(VariData, 1)
y = UBound(VariData, 2)
For m = 0 To x
For n = 0 To y
Print VariData(m, n); ‘用分號表示同一字段的數據打印在同一行。
Next n
Print
Next m
該方法格式:變體變量=記錄集.GetRows([rows],[start],[fields])有三個可選參數,第一個參數Rows限制返回的記錄數量,即要複製幾行記錄,它決定的是變體數組的第二維長度,缺省情況下,將讀取記錄集中的所有記錄。第二個參數Start指定從哪個記錄位置開始向數組複製記錄,可以是一個記錄書籤字符串,或以下三個常數之一:adBookMarkCurrent(當前記錄)adBookMarkFirst(首記錄錄)adBookMarkLast(尾記錄);第三個參數Fields限制返回的記錄字段,即要複製哪幾列,它決定的是變體數組的第一維長度,缺省情況下,將讀取記錄集中的所有字段,該參數可設置爲單個字段名字符串,或多個字段名字符串組成的數組。
注意:使用該方法複製記錄值時,記錄指針將隨之移動,每複製一行後,指針自動移動到下一行。
★ GetString: 將 Recordset 按字符串值的變體型 (BSTR) 返回。
★ MarshalOptions: 彙集選項。指示要被調度返回服務器的記錄。可選設置值:AdMarshalAll 默認值。表明所有行將返回到服務器。 AdMarshalModifiedOnly 表明只有已修改的行返回到服務器。當使用客戶端 (ADOR) Recordset 時,已在客戶端被修改的記錄將通過稱作“調度”的技術寫回中間層或 Web 服務器。
★ MaxRecords: 指示通過一次查詢返回 Recordset 的記錄的最大數目。使用 MaxRecords 屬性可對從數據源返回的記錄數加以限制。該屬性的默認設置爲零,表明提供者返回所有所需的記錄。Recordset 關閉時,MaxRecords 屬性爲讀/寫,打開時爲只讀。
★ NextRecordset:清除當前Recordset對象,執行下一個命令返回新的Recordset對象。當一個命令語句是複合語句(即用分號隔開的多條命令)?時,用該方法依次執行下一條命令。格式:Set recordset2=recordset1.NextRecordset。例如:
Dim rst As ADODB.Recordset
Dim strCnn As String
Dim strCmd As String
strCnn = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=C:/工商所收費系統/MyDatabase.mdb"
strCmd = "SELECT * FROM unitrecord;SELECT * FROM invoice" ‘AccessSQL不支持。
Set rst = New ADODB.Recordset
rst.Open strCmd, strCnn, adOpenDynamic, adLockOptimistic, adCmdText
Print rst("Name")
Set rst = rst.NextRecordset
Print rst("Name")
rst.Close
★ Open:打開一個遊標,即記錄集。
★ PageCount:頁面數。
★ PageSize:每頁大小,缺省爲10。
★ Properties:
★ Resync:
★ Save:
★ Seek方法:使用索引進行查詢,比用Find方法速度更快,但只能用於以表形式打開的記錄集,不能用於動態記錄集或快照型記錄集,不能在遠程服務器表上使用Seek,因爲遠程數據源不能以表形式打開。而且這個表預先定義了索引字段,使用Seek方法前,要在代碼中用Index屬性指定當前要使用的索引,格式爲:記錄集對象.Index=索引名。索引名是在表的設計階段定義好的。注意索引名不等於字段名,只不過是以某個字段爲標準的。設置好要使用的索引後,使用Seek進行查找,格式:Recordset對象.Seek 值,這裏的值參數指定按當前索引所屬字段進行查找的值,若找到,則指針指到此記錄,若沒找到,則EOF爲True.
一般情況下,在ADO中都不用Seek進行定位,而是用SQL查詢生成動態記錄集。只是在DAO中有一些使用,如:
Private Sub Command2_Click()
Data1.Recordset.Index = "indexName"
Data1.Recordset.Seek "=", "李春生"
Text1.Text = Data1.Recordset(2)
End Sub
其格式有一點不同,它的第一參數指定一個比較符號,第二個參數纔是值,需要在屬性窗口中將DATA1的RecordsetType屬性設置爲0-Table。 
★ Sort:
★ Source:數據源。
★ State:對象的當前狀態,有adStateClosed(關閉)或adStateOpen(打開)。
★ Status:批量操作或海量操作的狀態。
★ StayInSync:
★ Supports方法:判斷本記錄集是否具有某個方面的功能。如:是否允許增添記錄If rst.Supports(adAddnew)=True then rst.Addnew,如果具有某項功能則返回True,不具備則返回False,該方法的一個參數是指定哪個方面,如adDelete是否允許刪除記錄,adBookmark是否支持書籤設置,adUpdate是否允許更新(即修改)數據源,adIndex是否可以使用index屬性設置索引,adSeek是否可用Seek方法定位記錄指針。再如判斷是否支持索引:MsgBox DataEnvironment1.rsCommand1.Supports(adIndex)。
記錄集有五種不同的類型:
Table:表示數據庫中一張表,記錄集與數據庫中的數據同步,可通過記錄集對數據庫添加,刪除等操作。
Dynaset:一張查詢結果集,可由多個表中不同數據組成,可通過記錄集對數據庫進行添加、刪除等操作。
Dynamic:與dynaset相似,但它有這樣的功能:當其他用戶修改記錄集的基表(數據庫表)時,會將修改反映到這個記錄集中,主要用於多用戶操作。
SnapShot:一張只讀的查詢結果集,可包含不同表中數據記錄,不能對記錄添加,修改等,可用於瀏覽數據庫。
Forward-Only:一個沒遊標的SnapShot記錄集,只能從頭到尾順序經過所有記錄,不能任意移動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章