Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

返回列表 發(fā)新帖
查看: 21534|回復(fù): 8
打印 上一主題 下一主題

[ADO/DAO] 【新手入門】之十五:淺談ADO之Recordset(上)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2014-11-17 09:02:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這一節(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è)記錄集了:
  1. Sub CreateRst()
  2. Dim rst As New ADODB.Recordset
  3. rst.Open "myTable", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  4. MsgBox rst(0)
  5. rst.Close
  6. Set rst = Nothing
  7. 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)下表
  
游標(biāo)類型
  
數(shù)值表示
記錄鎖定類型
數(shù)值表示
adOpenForwardOnly
0
adLockReadOnly
1
adOpenKeyset
1
adLockPessimistic
2
adOpenDynamic
2
adLockOptimistic
3
adOpenStatic
3
adLockBatchOptimistic
4
有時(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)下表:
  
記錄鎖定類型
  
實(shí)際游標(biāo)類型
adLockReadOnly
adOpenForwardOnly外,其它均轉(zhuǎn)為adOpenStatic
adLockPessimistic
全部轉(zhuǎn)為adOpenKeyset
adLockOptimistic
全部轉(zhuǎn)為adOpenKeyset
adLockBatchOptimistic
全部轉(zhuǎn)為adOpenKeyset
當(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)判斷是否允許添加的例子,我略作修改后如下:
  1. Sub AddRecord()
  2. Dim rst As New ADODB.Recordset
  3. Dim s As String
  4. rst.Open "myTable", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  5. s = "10620029"
  6. rst.Find "服務(wù)代碼='" & s & "'"
  7. If Not rst.EOF Then’如果已經(jīng)找到記錄
  8.     MsgBox "已占用"
  9.     Debug.Print rst.RecordCount’在立即窗口打印出記錄條數(shù)
  10. Else’否則新增一條記錄
  11.     rst.AddNew
  12.     rst(1) = "haha"’給新紀(jì)錄賦值
  13.     rst(3) = s
  14.     rst.update’更新記錄
  15.     Debug.Print rst.RecordCount
  16. End If
  17. rst.Close
  18. 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”:
  1. For i=1 to Rst.ReordCount
  2.        Rst(1)=”haha”
  3.     Rst.MoveNext
  4. Next i
復(fù)制代碼
或者用Do……Loop:
  1. Do Until Rst.EOF
  2.        Rst(1)=”haha”
  3.     Rst.MoveNext
  4. 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)

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖1 訂閱訂閱
2#
發(fā)表于 2014-11-17 12:04:16 來(lái)自手機(jī) | 只看該作者
我要仔細(xì)的學(xué)習(xí)一下。
3#
發(fā)表于 2014-11-22 08:36:02 來(lái)自手機(jī) | 只看該作者
樓主你好,你說(shuō)到了記錄集,說(shuō)表和查詢都屬于recordset,那我問(wèn)一下,做的查詢,1,占access文件空間嗎?2,在表中是否用數(shù)字代替漢字省空間,3因?yàn)楹芏嗖樵,比如單位名稱,在表里用的是自然編號(hào),在查詢里用的是單位名稱,比如某某公司,便于人查看。
4#
 樓主| 發(fā)表于 2014-11-22 09:02:45 | 只看該作者
cfedf 發(fā)表于 2014-11-22 08:36
樓主你好,你說(shuō)到了記錄集,說(shuō)表和查詢都屬于recordset,那我問(wèn)一下,做的查詢,1,占access文件空間嗎?2, ...

空間當(dāng)然會(huì)占一點(diǎn)的,但這不成問(wèn)題。數(shù)據(jù)庫(kù)文件的大小一般主要看表和窗體。表的數(shù)據(jù)越多就越大,例如幾十萬(wàn)條記錄的話,可能會(huì)有十幾M。特別地,如果表里有圖片字段,體積會(huì)陡增。而窗體的圖片文件越多也就越大,例如用較多的背景圖片或者用圖片做菜單等等。
至于是否用漢字命名字段之類見(jiàn)仁見(jiàn)智。就我所知,用漢字命名的模塊兼容性很好,更不用說(shuō)表、查詢和窗體之類了。但是,為了避免某些用戶的系統(tǒng)語(yǔ)言為英文的情況,建議還是盡量使用英文。
第三個(gè)問(wèn)題。請(qǐng)?jiān)谡搲锼阉鳌皠⑿≤姵S么绑w查詢”來(lái)學(xué)習(xí)下。
5#
發(fā)表于 2014-11-22 16:08:44 | 只看該作者
學(xué)習(xí)啦!謝謝樓主
6#
發(fā)表于 2015-2-2 17:04:08 | 只看該作者
啊啊啊啊啊啊啊啊啊
7#
發(fā)表于 2015-5-4 13:03:22 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

點(diǎn)擊這里給我發(fā)消息

8#
發(fā)表于 2016-5-31 09:22:31 | 只看該作者
謝謝分享~
回復(fù)

使用道具 舉報(bào)

9#
發(fā)表于 2016-12-24 12:41:50 | 只看該作者
非常好,謝謝!!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-13 02:23 , Processed in 0.102139 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表