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

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開始

12下一頁(yè)
返回列表 發(fā)新帖
查看: 23320|回復(fù): 13
打印 上一主題 下一主題

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2014-11-17 09:06:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
記錄集的基本操作講解到此結(jié)束,下面再講些可能不太常用的或者屬性。
第一個(gè)方法:GetString(字符串類型,想獲取的行數(shù),字段分隔符,記錄分隔符,空值表達(dá)式)
最后一個(gè)參數(shù)沒(méi)仔細(xì)研究過(guò)。有時(shí)候,我們需要把所有符合條件的記錄合并成一個(gè)文本字符串,這時(shí)候,這個(gè)函數(shù)就派上用場(chǎng)了:
  1. Sub GetStr1()
  2. Dim rst As New ADODB.Recordset
  3. Dim s As String
  4. rst.Open "select 企業(yè)代碼 from myTable2 where 違規(guī)月份='9月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  5. s = rst.GetString(adClipString, , , ",")
  6. Debug.Print "9月違規(guī)的企業(yè)分別是:" & Left(s, Len(s) - 1)
  7. End Sub
復(fù)制代碼
改成循環(huán)語(yǔ)句則是這樣:
  1. Sub GetStr2()
  2. Dim rst As New ADODB.Recordset
  3. Dim s As String
  4. rst.Open "select 企業(yè)代碼 from myTable2 where 違規(guī)月份='9月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  5. Do Until rst.EOF
  6.     s = s & "," & rst(0)
  7.     rst.MoveNext
  8. Loop
  9. Debug.Print "9月違規(guī)的企業(yè)如下:" & Right(s, Len(s) - 1)
  10. End Sub
復(fù)制代碼
相比之下,孰優(yōu)孰劣自不待言!(dāng)然,更復(fù)雜的寫法是用GetRows方法:
  1. Sub GetStr3()
  2. Dim rst As New ADODB.Recordset
  3. Dim s()
  4. Dim i As Long, j As Long
  5. Dim k As String
  6. rst.Open "select * from myTable2 where 服務(wù)代碼='10669967'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  7. s = rst.GetRows()
  8. For i = 0 To UBound(s, 2)’ UBound(s, 2)
  9.     For j = 0 To UBound(s, 1)
  10.         k = k & ":" & s(j, i)
  11.     Next
  12. Next
  13. Debug.Print k
  14. End Sub
復(fù)制代碼

這是因?yàn)镚etRows返回的是一個(gè)二維數(shù)組。二維數(shù)組?這是神馬。俊烙(jì)有人會(huì)問(wèn)了。這里先簡(jiǎn)單普及下吧,有時(shí)間再發(fā)一些掃盲貼:
數(shù)組下限是默認(rèn)從0開始的。二維常數(shù)數(shù)組,通常是像下面這樣寫的:
  1. Sub test()
  2. Dim arr(1, 2)’定義一個(gè)2列×3行的數(shù)組。如果希望從1開始,則改為:arr(1 to 2,1 to 3)
  3. arr(0, 0) = "1"
  4. arr(0, 1) = "2"
  5. arr(0, 2) = "3"
  6. arr(1, 0) = "4"
  7. arr(1, 1) = "5"
  8. arr(1, 2) = "6"
  9. Debug.Print “行數(shù)上限是:” & UBound(arr, 2) & ”列數(shù)下限是:” & LBound(arr,1)
  10. ‘最后一個(gè)參數(shù)表示的是維度。
  11. End Sub
復(fù)制代碼
當(dāng)然,還有三維、四維數(shù)組等等,例如arr(0 to 1, 2 to 4, 3 to 5),但在Access里應(yīng)用不太廣泛。數(shù)組普及至此結(jié)束,下面回來(lái)看看GetRows的參數(shù):
第一個(gè)參數(shù):需要獲取的行數(shù),默認(rèn)為全部行數(shù)。
第二個(gè)參數(shù):起始行標(biāo),
第三個(gè)參數(shù):列標(biāo)。
第二、三個(gè)參數(shù)下標(biāo)均從0開始,可以理解嗎?
最后,我們來(lái)點(diǎn)更有意思的:保存記錄集和讀取本地記錄集文件。先貼代碼:
  1. Sub SaveRecord()
  2. Dim rst As New ADODB.Recordset
  3. rst.Open "select * from mytable where 違規(guī)月份='1月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
  4. rst.Save "E:\myReordset.xml", adPersistXML
  5. rst.Close
  6. Set rst = Nothing
  7. End Sub
復(fù)制代碼
就這么幾句,一個(gè)記錄集就以XML格式保存在E盤了。XML比較直觀,用記事本或者IE瀏覽器就能打開。是不是覺(jué)得安全性太低?,那我們改為ADTG格式試試:
  1. rst.Save "E:\myReordset.adtg", adPersistADTG
復(fù)制代碼
還能用記事本打開嗎?要不,看看Access能不能導(dǎo)入?好像也沒(méi)有這個(gè)格式…是不是有種鎖門準(zhǔn)備出去時(shí)才發(fā)現(xiàn)鑰匙落在房間里面的感覺(jué)呢?不過(guò)這次我們不用請(qǐng)鎖匠,用ADO來(lái)讀取就可以了。
  1. Sub ReadRecord()
  2. Dim rst As New ADODB.Recordset
  3. rst.Open "E:\myReordset.ADTG", , adOpenKeyset, adLockOptimistic, adCmdText
  4. Do Until rst.EOF
  5. Debug.Print rst(3)
  6. rst.MoveNext
  7. Loop
  8. End Sub
復(fù)制代碼
跟前面比較,發(fā)現(xiàn)什么了嗎?
保存記錄集時(shí)仍需數(shù)據(jù)連接參數(shù),但讀取時(shí)卻不再需要了,這是最大的不同。另外,最后一個(gè)參數(shù)為可選參數(shù),可填可不填。
當(dāng)然,Recordset里還有很多有趣的屬性,但在Access里不是很常用,這里便稍稍提一下,有興趣的版友可以自行研究一下。
1、用AbsolutePosition屬性用于顯示當(dāng)前記錄的光標(biāo)位置,請(qǐng)參考盜夢(mèng)的實(shí)例。
2、用PageSize和PageCount屬性來(lái)分頁(yè),這常常應(yīng)用于網(wǎng)頁(yè)中。由于Access缺少Table類控件,我也不建議這樣做,不過(guò)還是做了個(gè)例子供大家參考。
3、用Filter屬性來(lái)篩選記錄集的一個(gè)子集。這個(gè)也應(yīng)用很少,因?yàn)檫@個(gè)子集既然可以能夠通過(guò)條件來(lái)篩選,那么,何不在開始時(shí)就設(shè)置條件呢?
ADO講解到此暫告一個(gè)段落,后面如果不太忙的話,或許會(huì)再談?wù)劻魑募?/font>stream)。

【新手入門】之一:If分支語(yǔ)句
【新手入門】之二:分支語(yǔ)句總結(jié)
【新手入門】之三:循環(huán)語(yǔ)句For
【新手入門】之四:循環(huán)語(yǔ)句Do和死循環(huán)
【新手入門】之五:公共變量與傳址過(guò)程、傳值過(guò)程
【新手入門】之六:“悲歡離合總無(wú)情”——淺談Split和Join
【新手入門】之七:嵌套與并列——再談If流程問(wèn)題
【新手入門】之八:“連就連”——淺談“&”和“+”連接符的區(qū)別

【新手入門】之九:從百錢百雞談起——淺談“規(guī)劃求解”兼答lingjiang問(wèn)
【新手入門】之十:書到用時(shí)方恨少——自定義菜單(Access 2003)的制作
【新手入門】之十一:淺談ADO之序言
【新手入門】之十二:淺談ADO之Connection
【新手入門】之十三:淺談ADO之Conmmand(上)
【新手入門】之十四:淺談ADO之Command(下)
【新手入門】之十五:淺談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)階】之十一:“庖丁解!焙汀凹o(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)

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒(méi)有帳號(hào)?注冊(cè)

x

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖1 訂閱訂閱
2#
發(fā)表于 2014-11-19 07:13:51 來(lái)自手機(jī) | 只看該作者

向樓主學(xué)習(xí),有幾個(gè)問(wèn)題問(wèn)一下。
1,為什么例子里面沒(méi)有類似于command的按鈕,沒(méi)有按鈕,怎么激發(fā)代碼了?
2,為什么代碼是sub開頭,一般不都是private sub command-click()開頭嗎?
主要這兩個(gè)。謝謝樓主的文章,很收益。
3#
 樓主| 發(fā)表于 2014-11-19 08:57:23 | 只看該作者
本帖最后由 roych 于 2014-11-19 09:10 編輯
cfedf 發(fā)表于 2014-11-19 07:13
向樓主學(xué)習(xí),有幾個(gè)問(wèn)題問(wèn)一下。
1,為什么例子里面沒(méi)有類似于command的按鈕,沒(méi)有按鈕,怎么激發(fā)代碼了 ...

1、按F5運(yùn)行就可以了。
如果非要按鈕,也可以設(shè)置個(gè)按鈕,然后
private sub command1_click()
call 函數(shù)名
end sub2、首先,我建立的是模塊級(jí)別的過(guò)程,默認(rèn)為公共模塊(Public,這個(gè)謂詞可以不加),在其它位置直接調(diào)用即可。如果加上私有化(Private)則只能在該模塊運(yùn)行,在其它地方調(diào)用時(shí)就會(huì)出現(xiàn)“子過(guò)程或函數(shù)未定義”的編譯錯(cuò)誤。
private sub command1_click()表示的是私有化按鈕單擊過(guò)程事件。只能在所隸屬的窗體上執(zhí)行!话闱闆r下,是無(wú)法在別的窗體上調(diào)用本窗體的單擊事件,如果需要這么做,往往只能在模塊級(jí)別上寫一個(gè)公共函數(shù),然后互相調(diào)用。

4#
發(fā)表于 2014-11-19 11:52:00 來(lái)自手機(jī) | 只看該作者
roych 發(fā)表于 2014-11-19 08:57
1、按F5運(yùn)行就可以了。
如果非要按鈕,也可以設(shè)置個(gè)按鈕,然后
private sub command1_click()

你太厲害了。這樣就不用一個(gè)按鈕一段代碼,call一下,多省事情。我正在研究你的例子,非常好。我想ado我終于知道怎么回事了。我先練著,有問(wèn)題向你請(qǐng)教,非常感謝你的熱心幫助。
5#
 樓主| 發(fā)表于 2014-11-19 11:58:16 | 只看該作者
cfedf 發(fā)表于 2014-11-19 11:52
你太厲害了。這樣就不用一個(gè)按鈕一段代碼,call一下,多省事情。我正在研究你的例子,非常好。我想ado我 ...

懶嘛。我向來(lái)是個(gè)懶人~~
6#
發(fā)表于 2014-11-19 20:45:13 | 只看該作者
roych 發(fā)表于 2014-11-19 11:58
懶嘛。我向來(lái)是個(gè)懶人~~

樓主您好,請(qǐng)教個(gè)問(wèn)題,你的代碼我在你的文件里運(yùn)行沒(méi)問(wèn)題,可是我把你的代碼用到我的ACCESS中測(cè)試出問(wèn)題了,我是直接復(fù)制黏貼你的代碼.結(jié)果是這樣的提示.

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒(méi)有帳號(hào)?注冊(cè)

x
7#
 樓主| 發(fā)表于 2014-11-20 09:08:18 | 只看該作者
cfedf 發(fā)表于 2014-11-19 20:45
樓主您好,請(qǐng)教個(gè)問(wèn)題,你的代碼我在你的文件里運(yùn)行沒(méi)問(wèn)題,可是我把你的代碼用到我的ACCESS中測(cè)試出問(wèn)題了, ...

應(yīng)該是沒(méi)有引用庫(kù)的問(wèn)題吧。在VBE里點(diǎn)擊“工具/引用”,然后選擇 ADO 2.8庫(kù)(Microsoft  ActiveX Data Object……)

點(diǎn)評(píng)

你太厲害了,我都不知道怎么感謝你.這下可以用了.  發(fā)表于 2014-11-20 09:49
8#
發(fā)表于 2014-11-22 16:42:37 | 只看該作者
老師,什么時(shí)候發(fā)表其他的基礎(chǔ)文章呀?
9#
 樓主| 發(fā)表于 2014-11-22 18:08:50 | 只看該作者
wanlong3390 發(fā)表于 2014-11-22 16:42
老師,什么時(shí)候發(fā)表其他的基礎(chǔ)文章呀?


先去淘貼里看看呀。
10#
發(fā)表于 2015-6-10 15:38:43 | 只看該作者
本帖最后由 wu8313 于 2015-6-14 19:39 編輯

GetString 非常好,謝謝指點(diǎn)。
可以把某個(gè)ACC本地表的所有行 轉(zhuǎn)化為 一個(gè)字符串 mystring1(形如:1001;1002;1003),傳遞給 存儲(chǔ)過(guò)程的文本型輸入?yún)?shù), 然后在SQL里面把這個(gè)文本型參數(shù)用表值函數(shù)轉(zhuǎn)化成表t1.從而實(shí)現(xiàn)批量插入,更新,刪除 。比如,delete from T1 where 工號(hào) in (select * from t1)



您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

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

GMT+8, 2024-10-23 06:25 , Processed in 0.123032 second(s), 38 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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