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

 找回密碼
 注冊(cè)

QQ登錄

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

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2014-11-17 09:06:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
記錄集的基本操作講解到此結(jié)束,下面再講些可能不太常用的或者屬性。
第一個(gè)方法:GetString(字符串類(lèi)型,想獲取的行數(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ù)雜的寫(xiě)法是用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開(kāi)始的。二維常數(shù)數(shù)組,通常是像下面這樣寫(xiě)的:
  1. Sub test()
  2. Dim arr(1, 2)’定義一個(gè)2列×3行的數(shù)組。如果希望從1開(kāi)始,則改為: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開(kāi)始,可以理解嗎?
最后,我們來(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盤(pán)了。XML比較直觀,用記事本或者IE瀏覽器就能打開(kāi)。是不是覺(jué)得安全性太低?,那我們改為ADTG格式試試:
  1. rst.Save "E:\myReordset.adtg", adPersistADTG
復(fù)制代碼
還能用記事本打開(kāi)嗎?要不,看看Access能不能導(dǎo)入?好像也沒(méi)有這個(gè)格式…是不是有種鎖門(mén)準(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類(lèi)控件,我也不建議這樣做,不過(guò)還是做了個(gè)例子供大家參考。
3、用Filter屬性來(lái)篩選記錄集的一個(gè)子集。這個(gè)也應(yīng)用很少,因?yàn)檫@個(gè)子集既然可以能夠通過(guò)條件來(lái)篩選,那么,何不在開(kāi)始時(shí)就設(shè)置條件呢?
ADO講解到此暫告一個(gè)段落,后面如果不太忙的話(huà),或許會(huì)再談?wù)劻魑募?/font>stream)。

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

【新手入門(mén)】之九:從百錢(qián)百雞談起——淺談“規(guī)劃求解”兼答lingjiang問(wèn)
【新手入門(mén)】之十:書(shū)到用時(shí)方恨少——自定義菜單(Access 2003)的制作
【新手入門(mén)】之十一:淺談ADO之序言
【新手入門(mén)】之十二:淺談ADO之Connection
【新手入門(mén)】之十三:淺談ADO之Conmmand(上)
【新手入門(mén)】之十四:淺談ADO之Command(下)
【新手入門(mén)】之十五:淺談ADO之Recordset(上)
【新手入門(mén)】之十六:淺談ADO之Recordset(下)
【新手入門(mén)】之十七:淺談列表框的使用
【新手入門(mén)】之十八:雙擊列表框修改數(shù)據(jù)
【新手入門(mén)】之十九:從“書(shū)與女友恕不外借”談起——淺談“Bookmark”的使用
【新手入門(mén)】之二十:“書(shū)與書(shū)簽”——bookmark屬性答疑
【新手入門(mén)】之二十一:記錄集的“凌遲”——逐條導(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

本帖被以下淘專(zhuān)輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖1 訂閱訂閱
13#
發(fā)表于 2016-12-24 07:05:26 | 只看該作者
非常好,非常感謝!!
12#
發(fā)表于 2016-12-24 07:04:26 | 只看該作者
非常感謝!!!
回復(fù)

使用道具 舉報(bào)

11#
發(fā)表于 2016-9-5 20:00:15 | 只看該作者
嘿嘿 竟然有附件!!
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)



9#
 樓主| 發(fā)表于 2014-11-22 18:08:50 | 只看該作者
wanlong3390 發(fā)表于 2014-11-22 16:42
老師,什么時(shí)候發(fā)表其他的基礎(chǔ)文章呀?


先去淘貼里看看呀。
8#
發(fā)表于 2014-11-22 16:42:37 | 只看該作者
老師,什么時(shí)候發(fā)表其他的基礎(chǔ)文章呀?
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
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
5#
 樓主| 發(fā)表于 2014-11-19 11:58:16 | 只看該作者
cfedf 發(fā)表于 2014-11-19 11:52
你太厲害了。這樣就不用一個(gè)按鈕一段代碼,call一下,多省事情。我正在研究你的例子,非常好。我想ado我 ...

懶嘛。我向來(lái)是個(gè)懶人~~
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

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

GMT+8, 2025-7-17 04:50 , Processed in 0.109147 second(s), 39 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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