Office中國論壇/Access中國論壇

標題: 【新手入門】之十六:淺談ADO之Recordset(下) [打印本頁]

作者: roych    時間: 2014-11-17 09:06
標題: 【新手入門】之十六:淺談ADO之Recordset(下)
記錄集的基本操作講解到此結(jié)束,下面再講些可能不太常用的或者屬性。
第一個方法:GetString(字符串類型,想獲取的行數(shù),字段分隔符,記錄分隔符,空值表達式)
最后一個參數(shù)沒仔細研究過。有時候,我們需要把所有符合條件的記錄合并成一個文本字符串,這時候,這個函數(shù)就派上用場了:
  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
復制代碼
改成循環(huán)語句則是這樣:
  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
復制代碼
相比之下,孰優(yōu)孰劣自不待言!斎,更復雜的寫法是用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 服務代碼='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
復制代碼

這是因為GetRows返回的是一個二維數(shù)組。二維數(shù)組?這是神馬啊?——估計有人會問了。這里先簡單普及下吧,有時間再發(fā)一些掃盲貼:
數(shù)組下限是默認從0開始的。二維常數(shù)數(shù)組,通常是像下面這樣寫的:
  1. Sub test()
  2. Dim arr(1, 2)’定義一個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. ‘最后一個參數(shù)表示的是維度。
  11. End Sub
復制代碼
當然,還有三維、四維數(shù)組等等,例如arr(0 to 1, 2 to 4, 3 to 5),但在Access里應用不太廣泛。數(shù)組普及至此結(jié)束,下面回來看看GetRows的參數(shù):
第一個參數(shù):需要獲取的行數(shù),默認為全部行數(shù)。
第二個參數(shù):起始行標,
第三個參數(shù):列標。
第二、三個參數(shù)下標均從0開始,可以理解嗎?
最后,我們來點更有意思的:保存記錄集和讀取本地記錄集文件。先貼代碼:
  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
復制代碼
就這么幾句,一個記錄集就以XML格式保存在E盤了。XML比較直觀,用記事本或者IE瀏覽器就能打開。是不是覺得安全性太低?,那我們改為ADTG格式試試:
  1. rst.Save "E:\myReordset.adtg", adPersistADTG
復制代碼
還能用記事本打開嗎?要不,看看Access能不能導入?好像也沒有這個格式…是不是有種鎖門準備出去時才發(fā)現(xiàn)鑰匙落在房間里面的感覺呢?不過這次我們不用請鎖匠,用ADO來讀取就可以了。
  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ā)現(xiàn)什么了嗎?
保存記錄集時仍需數(shù)據(jù)連接參數(shù),但讀取時卻不再需要了,這是最大的不同。另外,最后一個參數(shù)為可選參數(shù),可填可不填。
當然,Recordset里還有很多有趣的屬性,但在Access里不是很常用,這里便稍稍提一下,有興趣的版友可以自行研究一下。
1、用AbsolutePosition屬性用于顯示當前記錄的光標位置,請參考盜夢的實例。
2、用PageSize和PageCount屬性來分頁,這常常應用于網(wǎng)頁中。由于Access缺少Table類控件,我也不建議這樣做,不過還是做了個例子供大家參考。
3、用Filter屬性來篩選記錄集的一個子集。這個也應用很少,因為這個子集既然可以能夠通過條件來篩選,那么,何不在開始時就設置條件呢?
ADO講解到此暫告一個段落,后面如果不太忙的話,或許會再談談流文件(stream)。
[attach]55018[/attach]
【新手入門】之一:If分支語句
【新手入門】之二:分支語句總結(jié)
【新手入門】之三:循環(huán)語句For
【新手入門】之四:循環(huán)語句Do和死循環(huán)
【新手入門】之五:公共變量與傳址過程、傳值過程
【新手入門】之六:“悲歡離合總無情”——淺談Split和Join
【新手入門】之七:嵌套與并列——再談If流程問題
【新手入門】之八:“連就連”——淺談“&”和“+”連接符的區(qū)別

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

【新手進階】之一:基礎算法(一)
【新手進階】之二:基礎算法(二)
【新手進階】之三:基礎算法(三)
【新手進階】之四:基礎算法(四)
【新手進階】之五:排序搜索(一)
【新手進階】之六:排序搜索(二)
【新手進階】之七:遞歸算法
【新手進階】之八:冒泡排序
【新手進階】之九:淺談不綁定數(shù)據(jù)源操作記錄
【新手進階】之十:工作日的計算
【新手進階】之十一:“庖丁解!焙汀凹o昌學射”——淺談表格式文本數(shù)據(jù)的導入
【新手進階】之十二:從四腳騰空的奔馬談起——原來界面可以這樣設計
【新手進階】之十三:Outlook風格導航界面
【新手進階】之十四:倉庫管理系統(tǒng)


作者: cfedf    時間: 2014-11-19 07:13

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

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


作者: cfedf    時間: 2014-11-19 11:52
roych 發(fā)表于 2014-11-19 08:57
1、按F5運行就可以了。
如果非要按鈕,也可以設置個按鈕,然后
private sub command1_click()

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

懶嘛。我向來是個懶人~~
作者: cfedf    時間: 2014-11-19 20:45
roych 發(fā)表于 2014-11-19 11:58
懶嘛。我向來是個懶人~~

[attach]55078[/attach]樓主您好,請教個問題,你的代碼我在你的文件里運行沒問題,可是我把你的代碼用到我的ACCESS中測試出問題了,我是直接復制黏貼你的代碼.結(jié)果是這樣的提示.
作者: roych    時間: 2014-11-20 09:08
cfedf 發(fā)表于 2014-11-19 20:45
樓主您好,請教個問題,你的代碼我在你的文件里運行沒問題,可是我把你的代碼用到我的ACCESS中測試出問題了, ...

應該是沒有引用庫的問題吧。在VBE里點擊“工具/引用”,然后選擇 ADO 2.8庫(Microsoft  ActiveX Data Object……)
作者: wanlong3390    時間: 2014-11-22 16:42
老師,什么時候發(fā)表其他的基礎文章呀?
作者: roych    時間: 2014-11-22 18:08
wanlong3390 發(fā)表于 2014-11-22 16:42
老師,什么時候發(fā)表其他的基礎文章呀?


先去淘貼里看看呀。
作者: wu8313    時間: 2015-6-10 15:38
本帖最后由 wu8313 于 2015-6-14 19:39 編輯

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




作者: datouda    時間: 2016-9-5 20:00
嘿嘿 竟然有附件!。
作者: shslsun    時間: 2016-12-24 07:04
非常感謝!!!
作者: shslsun    時間: 2016-12-24 07:05
非常好,非常感謝!!




歡迎光臨 Office中國論壇/Access中國論壇 (http://ctxi.cn/) Powered by Discuz! X3.3