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