[英]Access VBA: What is the difference between dao.recordset vs recordset?
[英]Access VBA Subscript out of range loading DAO.Recordset
當我嘗試從 Access 查詢中加載和使用記錄集時,我看到不一致的結果並出現下標超出范圍錯誤。 我正在從這個查詢中加載:記錄源
這是我的代碼的相關部分:
Option Compare Database
Option Explicit
Function StoreStockoutEmail()
Dim objOutlook As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Dim objOutlookRecip As Outlook.Recipient
Dim dtStr As String
Dim rstData As DAO.Recordset
Dim v As Variant
Dim i, j, k, x, y As Integer
Dim mymsg As String
mymsg = ""
Set rstData = CurrentDb.OpenRecordset("Select * From Store_Stockouts")
v = rstData.GetRows(rstData.RecordCount)
If Not rstData.EOF And Not rstData.BOF Then
rstData.MoveLast
i = rstData.RecordCount
rstData.MoveFirst
MsgBox (v(0, 2))
...
MsgBox 是我得到運行時錯誤 9“下標超出范圍”的地方,但我的數據源的數據點位於 0,2(和 2,0)。 (我根據另一個答案添加了 EOF 和 BOF 運動,但沒有幫助。)我覺得這可能是一個錯誤,因為這對某些記錄集有效,而對其他記錄集無效。 適用於 Micosoft 365 32 位的 MS Access。 為 MS DAO 3.6 Object 庫添加了參考。 謝謝!
正如 Tim Williams 暗示的那樣,在您執行.MoveLast /.MoveFirst
舞蹈之前, rstData.RecordCount
可能不正確。 (見注2)
檢查rstData.EOF
應該直接跟.OpenRecordset
。 在這里檢查.BOF
是不必要的(貨物崇拜)。
所以代碼應該是:
Set rstData = CurrentDb.OpenRecordset("Select * From Store_Stockouts")
If Not rstData.EOF Then
rstData.MoveLast
i = rstData.RecordCount
rstData.MoveFirst
v = rstData.GetRows(i)
邊注:
Dim i, j, k, x, y As Integer
這將所有內容聲明為 Variant,只有y
將是 Integer。
筆記2:
我覺得這可能是一個錯誤,因為這對某些記錄集有效,而對其他記錄集無效。
這是設計使然。 Allen Browne 在 4. 中對其進行了解釋: http://allenbrowne.com/ser-29.html
對於基於查詢、SQL 語句和附加表的記錄集,RecordCount 屬性返回到目前為止訪問的記錄數。 當您第一次使用 OpenRecordset() 時,Access 會抓取第一條記錄,並在其他代碼加載時繼續處理您的代碼。
因此,如果您在 OpenRecordset 之后立即測試 RecordCount,您通常會得到 0(如果沒有記錄)或 1(如果有,無論加載多少。)
這不適用於 dbOpenTable 類型的記錄集(本地表的默認值。)解決方案:
如果您需要知道 RecordCount,請先使用 MoveLast 方法。 這會強制 Access 在加載所有記錄時等待,因此 RecordCount 反映了整個記錄集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.