設為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
1#
發(fā)表于 2014-11-17 09:02:14 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
這一節(jié),我們來學習記錄集(Recordset)。
相比于其它子集來說,記錄集是大家最熟悉,卻又最易被誤解的一個。開始接觸記錄集時,我是把它當做表或者查詢來理解的。隨著學習的深入,才漸漸明白,表和查詢只是記錄集最常見的兩種表現(xiàn)形式而已,套用某句臺詞來說,“表或者查詢只是我的表面工作,其實我的真正身份是記!錄!集!”
好了,言歸正傳。根據(jù)前面的只是,我們很輕易就可以創(chuàng)建一個記錄集了:
  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
復制代碼
第一句表示創(chuàng)建一個記錄集,然后用第二句來打開它,第三句則是把第一個字段的第一個值用彈窗顯示出來,然后關閉記錄集并清空內(nèi)存。
Open的參數(shù)其實有五個,只是我們常用的只有4個,最后一個可選參數(shù),我們常常忽略了。
第一個參數(shù):表示需要打開的記錄集,它可以是一個表或者選擇查詢,還可以是一個文件。——這將在本文最后的部分討論,先按下不表。
第二個參數(shù):表示的是數(shù)據(jù)連接。在Access里可以用CurrentProject.Connection來表示,外部數(shù)據(jù)連接則需要創(chuàng)建連接,并先行打開,詳見本系列的第一節(jié)。
第三個參數(shù):游標鎖定類型。見下表
第四個參數(shù):記錄鎖定類型。見下表
  
游標類型
  
數(shù)值表示
記錄鎖定類型
數(shù)值表示
adOpenForwardOnly
0
adLockReadOnly
1
adOpenKeyset
1
adLockPessimistic
2
adOpenDynamic
2
adLockOptimistic
3
adOpenStatic
3
adLockBatchOptimistic
4
有時候我們看到這樣的語句:rst.Open"myTable", CurrentProject.Connection, 2,3就是這么來的。但我不贊成這樣寫,我相信,沒有誰愿意去記住這些數(shù)字分別代表什么,而且這樣很易出錯。例如不小心用了只讀的記錄鎖定類型,卻去試圖修改記錄集就會出錯。實際的游標類型,常常優(yōu)先取決于記錄鎖定類型。詳見下表:
  
記錄鎖定類型
  
實際游標類型
adLockReadOnly
adOpenForwardOnly外,其它均轉為adOpenStatic
adLockPessimistic
全部轉為adOpenKeyset
adLockOptimistic
全部轉為adOpenKeyset
adLockBatchOptimistic
全部轉為adOpenKeyset
當記錄鎖定類型為只讀(adLockReadOnly)時,記錄集將不可以進行增刪改等操作,即只有Move相關幾個方法和Find方法。特別地,而當游標為只進(adOpenForwardOnly)時,這相當于記錄集的快照模式,連RecordCount都成為-1了。剩下的方法只有:Find、MoveFirst、MoveNext和Move(還不能是負數(shù)哦)。
根據(jù)《Access 2007 VBA寶典》的介紹,當游標類型為動態(tài)時(adOpenDynamic),允許查看其它用戶的增刪改操作,并允許執(zhí)行各種移動、查找和增刪改操作。當它為鍵盤鎖定(adOpenKeyset)時則無法查看其它用戶增刪的記錄,只能查看修改的記錄;而為靜態(tài)鎖定時,其它用戶操作的記錄則無法查看了。但如何查看,著者并沒有給出具體辦法,只給出一個根據(jù)用戶輸入值來判斷是否允許添加的例子,我略作修改后如下:
  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 "服務代碼='" & 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"’給新紀錄賦值
  13.     rst(3) = s
  14.     rst.update’更新記錄
  15.     Debug.Print rst.RecordCount
  16. End If
  17. rst.Close
  18. End Sub
復制代碼
這段代碼表示的是,先查找是否存在這個服務代碼的記錄,如果存在則表示已占用,否則就新增一條記錄!@對于禁止用戶輸入重復值很有用。另外一個辦法是:通過對字段設置“索引(無重復值)”或者主鍵來禁止。
下面,我們開始介紹記錄集的常用操作方法有:
AddNew:新增一條記錄
Delete:刪除一條記錄。
這兩個方法常常結合update方法來更新記錄集。還可以在全部操作完成后,用批量更新(UpdateBatch)一次性完成。雖然在正確的記錄鎖定類型下,刪除記錄并不需要更新操作也會執(zhí)行,為保險起見,還是建議大家寫上這一句。
細心的你,一定發(fā)現(xiàn),不是“增刪改”嗎?怎么沒有修改的方法呢?怎么修改記錄?Roy的回答是:給已有記錄重新賦值。上面的rst(1)=”haha”就是一個例子。
在我給出的例子中基本沒有循環(huán)操作,因此,當大家需要批量處理記錄集時,一定要加上循環(huán)語句,例如把第二個字段所有記錄均改為“haha”:
  1. For i=1 to Rst.ReordCount
  2.        Rst(1)=”haha”
  3.     Rst.MoveNext
  4. Next i
復制代碼
或者用Do……Loop:
  1. Do Until Rst.EOF
  2.        Rst(1)=”haha”
  3.     Rst.MoveNext
  4. 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)

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖1 訂閱訂閱
9#
發(fā)表于 2016-12-24 12:41:50 | 只看該作者
非常好,謝謝!!

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

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

使用道具 舉報

7#
發(fā)表于 2015-5-4 13:03:22 | 只看該作者
謝謝分享!
回復

使用道具 舉報

6#
發(fā)表于 2015-2-2 17:04:08 | 只看該作者
啊啊啊啊啊啊啊啊啊
5#
發(fā)表于 2014-11-22 16:08:44 | 只看該作者
學習啦!謝謝樓主
4#
 樓主| 發(fā)表于 2014-11-22 09:02:45 | 只看該作者
cfedf 發(fā)表于 2014-11-22 08:36
樓主你好,你說到了記錄集,說表和查詢都屬于recordset,那我問一下,做的查詢,1,占access文件空間嗎?2, ...

空間當然會占一點的,但這不成問題。數(shù)據(jù)庫文件的大小一般主要看表和窗體。表的數(shù)據(jù)越多就越大,例如幾十萬條記錄的話,可能會有十幾M。特別地,如果表里有圖片字段,體積會陡增。而窗體的圖片文件越多也就越大,例如用較多的背景圖片或者用圖片做菜單等等。
至于是否用漢字命名字段之類見仁見智。就我所知,用漢字命名的模塊兼容性很好,更不用說表、查詢和窗體之類了。但是,為了避免某些用戶的系統(tǒng)語言為英文的情況,建議還是盡量使用英文。
第三個問題。請在論壇里搜索“劉小軍常用窗體查詢”來學習下。
3#
發(fā)表于 2014-11-22 08:36:02 來自手機 | 只看該作者
樓主你好,你說到了記錄集,說表和查詢都屬于recordset,那我問一下,做的查詢,1,占access文件空間嗎?2,在表中是否用數(shù)字代替漢字省空間,3因為很多查詢,比如單位名稱,在表里用的是自然編號,在查詢里用的是單位名稱,比如某某公司,便于人查看。
2#
發(fā)表于 2014-11-17 12:04:16 來自手機 | 只看該作者
我要仔細的學習一下。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 07:53 , Processed in 0.102415 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表