這一節(jié),我們來學習記錄集(Recordset)。 相比于其它子集來說,記錄集是大家最熟悉,卻又最易被誤解的一個。開始接觸記錄集時,我是把它當做表或者查詢來理解的。隨著學習的深入,才漸漸明白,表和查詢只是記錄集最常見的兩種表現(xiàn)形式而已,套用某句臺詞來說,“表或者查詢只是我的表面工作,其實我的真正身份是記!錄!集!” 好了,言歸正傳。根據(jù)前面的只是,我們很輕易就可以創(chuàng)建一個記錄集了: - Sub CreateRst()
- Dim rst As New ADODB.Recordset
- rst.Open "myTable", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
- MsgBox rst(0)
- rst.Close
- Set rst = Nothing
- End Sub
復制代碼第一句表示創(chuàng)建一個記錄集,然后用第二句來打開它,第三句則是把第一個字段的第一個值用彈窗顯示出來,然后關閉記錄集并清空內(nèi)存。 Open的參數(shù)其實有五個,只是我們常用的只有4個,最后一個可選參數(shù),我們常常忽略了。 第一個參數(shù):表示需要打開的記錄集,它可以是一個表或者選擇查詢,還可以是一個文件。——這將在本文最后的部分討論,先按下不表。 第二個參數(shù):表示的是數(shù)據(jù)連接。在Access里可以用CurrentProject.Connection來表示,外部數(shù)據(jù)連接則需要創(chuàng)建連接,并先行打開,詳見本系列的第一節(jié)。 第三個參數(shù):游標鎖定類型。見下表 第四個參數(shù):記錄鎖定類型。見下表 有時候我們看到這樣的語句:rst.Open"myTable", CurrentProject.Connection, 2,3就是這么來的。但我不贊成這樣寫,我相信,沒有誰愿意去記住這些數(shù)字分別代表什么,而且這樣很易出錯。例如不小心用了只讀的記錄鎖定類型,卻去試圖修改記錄集就會出錯。實際的游標類型,常常優(yōu)先取決于記錄鎖定類型。詳見下表: 記錄鎖定類型 | | | 除adOpenForwardOnly外,其它均轉為adOpenStatic | | | | | | |
當記錄鎖定類型為只讀(adLockReadOnly)時,記錄集將不可以進行增刪改等操作,即只有Move相關幾個方法和Find方法。特別地,而當游標為只進(adOpenForwardOnly)時,這相當于記錄集的快照模式,連RecordCount都成為-1了。剩下的方法只有:Find、MoveFirst、MoveNext和Move(還不能是負數(shù)哦)。 根據(jù)《Access 2007 VBA寶典》的介紹,當游標類型為動態(tài)時(adOpenDynamic),允許查看其它用戶的增刪改操作,并允許執(zhí)行各種移動、查找和增刪改操作。當它為鍵盤鎖定(adOpenKeyset)時則無法查看其它用戶增刪的記錄,只能查看修改的記錄;而為靜態(tài)鎖定時,其它用戶操作的記錄則無法查看了。但如何查看,著者并沒有給出具體辦法,只給出一個根據(jù)用戶輸入值來判斷是否允許添加的例子,我略作修改后如下: - Sub AddRecord()
- Dim rst As New ADODB.Recordset
- Dim s As String
- rst.Open "myTable", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
- s = "10620029"
- rst.Find "服務代碼='" & s & "'"
- If Not rst.EOF Then’如果已經(jīng)找到記錄
- MsgBox "已占用"
- Debug.Print rst.RecordCount’在立即窗口打印出記錄條數(shù)
- Else’否則新增一條記錄
- rst.AddNew
- rst(1) = "haha"’給新紀錄賦值
- rst(3) = s
- rst.update’更新記錄
- Debug.Print rst.RecordCount
- End If
- rst.Close
- End Sub
復制代碼這段代碼表示的是,先查找是否存在這個服務代碼的記錄,如果存在則表示已占用,否則就新增一條記錄!@對于禁止用戶輸入重復值很有用。另外一個辦法是:通過對字段設置“索引(無重復值)”或者主鍵來禁止。 下面,我們開始介紹記錄集的常用操作方法有: AddNew:新增一條記錄 Delete:刪除一條記錄。 這兩個方法常常結合update方法來更新記錄集。還可以在全部操作完成后,用批量更新(UpdateBatch)一次性完成。雖然在正確的記錄鎖定類型下,刪除記錄并不需要更新操作也會執(zhí)行,為保險起見,還是建議大家寫上這一句。 細心的你,一定發(fā)現(xiàn),不是“增刪改”嗎?怎么沒有修改的方法呢?怎么修改記錄?Roy的回答是:給已有記錄重新賦值。上面的rst(1)=”haha”就是一個例子。 在我給出的例子中基本沒有循環(huán)操作,因此,當大家需要批量處理記錄集時,一定要加上循環(huán)語句,例如把第二個字段所有記錄均改為“haha”: - For i=1 to Rst.ReordCount
- Rst(1)=”haha”
- Rst.MoveNext
- Next i
復制代碼或者用Do……Loop: - Do Until Rst.EOF
- Rst(1)=”haha”
- Rst.MoveNext
- Loop
復制代碼ReordCount 表示的記錄總條數(shù),而EOF屬性則表示的文件末尾。具體用哪個循環(huán),則視個人編程習慣而定了。如果不太熟悉循環(huán)語句,可以參考之前的新手進階系列。 RecordCount與游標類型有一定的關系,盜夢曾提到,用Command執(zhí)行存儲過程中,RecordCount只能返回-1。同樣地,當記錄鎖定類型為只讀時,RecordCount也是-1,這時候就只能用EOF了。
-----------------------
由于帖子長度所限,請從這里返回更早的帖子
【新手入門】之十五:淺談ADO之Recordset(上)
【新手入門】之十六:淺談ADO之Recordset(下)
【新手入門】之十七:淺談列表框的使用
【新手入門】之十八:雙擊列表框修改數(shù)據(jù)
【新手入門】之十九:從“書與女友恕不外借”談起——淺談“Bookmark”的使用
【新手入門】之二十:“書與書簽”——bookmark屬性答疑
【新手入門】之二十一:記錄集的“凌遲”——逐條導出記錄集
【新手進階】之一:基礎算法(一)
【新手進階】之二:基礎算法(二)
【新手進階】之三:基礎算法(三)
【新手進階】之四:基礎算法(四)
【新手進階】之五:排序搜索(一)
【新手進階】之六:排序搜索(二)
【新手進階】之七:遞歸算法
【新手進階】之八:冒泡排序
【新手進階】之九:淺談不綁定數(shù)據(jù)源操作記錄
【新手進階】之十:工作日的計算
【新手進階】之十一:“庖丁解牛”和“紀昌學射”——淺談表格式文本數(shù)據(jù)的導入
【新手進階】之十二:從四腳騰空的奔馬談起——原來界面可以這樣設計
【新手進階】之十三:Outlook風格導航界面
【新手進階】之十四:倉庫管理系統(tǒng)
|