2010-03-08 81 views
15

我正試圖將數據從記錄集直接移動到數組中。我知道這是可能的,但具體我想,因爲這是在MS Access正在做2003年如何填充具有記錄集數據的陣列

通常我會做類似下面來實現這一爲此在VBA:

Dim vaData As Variant 
    Dim rst As ADODB.Recordset 

    ' Pull data into recordset code here... 

    ' Populate the array with the whole recordset. 
    vaData = rst.GetRows 

什麼區別存在於VB和VBA之間,這使得這種類型的操作不起作用?

性能問題呢?這是一個「昂貴的」操作嗎?

+0

一個記錄集是一個數組,比VBA數組更多樣化(即按列名引用而不僅僅是列索引)。爲什麼不直接使用記錄集?我已經在VBA/DAO中進行了十多年的編程,並且從未使用過GetRows。是什麼讓你覺得你需要它? – 2010-03-09 21:59:13

+0

專門用於最大限度地減少與其他ADODB對象的連接打開的時間。 – 2010-03-10 05:27:22

+2

那麼ADO斷開的記錄集呢? – 2010-03-12 04:13:00

回答

1

您的示例無法正常工作的常見原因是ADO的正確庫尚未被引用(工具 - >引用,Microsoft ActiveX數據對象x.x庫),否則應該沒問題。

0

我同意它看起來像它可能是一個參考問題。

如果你要堅持使用access/jet,那麼你可能會考慮使用DAO,因爲所有的東西都是相等的,它會比ADO更快。下面是一個簡單的例子

Public Sub Foo() 
Dim aFoo As Variant 
Dim db As DAO.Database 
Dim rst As DAO.Recordset 

Set db = DBEngine(0)(0) 
Set rst = db.OpenRecordset("tblFoo") 

With rst 
    .MoveLast 
    .MoveFirst 
    aFoo = .GetRows(.RecordCount) 
End With 

rst.Close 
db.Close 

End Sub 
16

下面的代碼對我的作品:

Dim rst   As ADODB.Recordset 
Dim vDat   As Variant 

Set rst = CurrentProject.Connection.Execute("select * from tblTemp4") 
vDat = rst.GetRows 

做一個調試編譯,因爲提到這可能是裁判的問題。如前所述,有些DAO需要考慮,但請牢記DAO要求您做出最後的決定。 ADO沒有。這些天來,ADO或DAO真的歸結於你的優先,並且性能很少成爲問題。 ADO往往是一個對象模型清潔一點,但無論你的家人是多數情況下最好的選擇

+0

DAO不需要.MoveLast,除非您想要一個準確的記錄計數,而您幾乎不需要實際記錄(您只需知道記錄集是否返回了記錄,並且記錄計數始終爲1或更多(如果DAO記錄集返回記錄)。我沒有理由使用ADO,這是死亡,死亡。 DAO是一個持續發展的實時數據庫引擎的一部分,在我看來,它是使用Jet/ACE數據的未來。 – 2010-03-09 21:47:59

+1

我現在從查看測試GetRows看到,如果您沒有傳遞任何參數,它只會檢索一行。您可以選擇一個任意大的數字並跳過.MoveLast並避免性能下降。或者您可以通過查看錶格來獲得準確的記錄數。RecordCount屬性,雖然這在鏈接表上不起作用,所以你不得不直接使用後端(並不是所有的代碼都很難編碼,而且肯定比大型記錄集上的MoveLast更有效),但它不會除了單表記錄集以外的其他工作。 – 2010-03-09 21:57:52

+1

@ David-W-Fenton ADO不死嗎?水壺在這裏叫黑鍋... – Robino 2014-09-22 15:39:08

1

在Access中,你可以做索引搜索。這是巧妙的最快的方法,甚至比在數組中搜索更快。

Set rs = CreateObject("ADODB.Recordset") 
    rs.CursorLocation = adUseServer 
    rs.Open "MyData", CurrentProject.Connection, , , adCmdTableDirect 
    rs.Index = "fieldX" 

    rs.Seek fieldXvalue 

如果你只是遍歷整個表而不是數組,那麼確實是最快的。一個例外:理論上,如果你有一個數字主鍵,你可以設置索引到它在數組中完全相同的位置,所以根本沒有rs.find或rs.seek,你可以像訪問數組(索引)那真的很快。我沒有針對索引搜索進行基準測試,但它可能會更快。