Как заполнить массив данными набора записей

Я пытаюсь перенести данные из набора записей непосредственно в массив. Я знаю, что это возможно, но, в частности, я хочу сделать это в VBA, поскольку это выполняется в MS Access 2003.

Как правило, для достижения этого я сделал бы что-то вроде следующего:

    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, которые не позволяют работать в этом типе?

Как насчет производительности? Это "дорогие" операции?

Ответы

Ответ 1

Обычная причина, по которой ваш образец не работает, заключается в том, что не была указана правильная библиотека для ADO (Tools- > References, Microsoft ActiveX Data Objects x.x Library), в противном случае это должно быть хорошо.

Ответ 2

Следующий код работает для меня:

Dim rst           As ADODB.Recordset
Dim vDat          As Variant

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

Сделайте компиляцию отладки, как уже упоминалось, это может быть проблема с ref. Как уже отмечалось, некоторые перфорированные DAO, но имейте в виду, DAO требует от вас сделать movelast. ADO не делает. В наши дни ADO или DAO действительно сводятся к вашим предпочтениям, и производительность редко бывает проблемой. ADO имеет тенденцию быть немного чище объектной модели, но независимо от того, что ваш familer с likey лучший выбор в большинстве случаев

Ответ 3

В 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, вы можете просто получить к нему доступ как массив (индекс) и это действительно ДЕЙСТВИТЕЛЬНО быстро. Я не тестировал индексированный поиск, но он может быть быстрее.

Ответ 4

Я согласен, что похоже, что это может быть справочная проблема.

Если вы собираетесь придерживаться доступа/струя, вы можете подумать о том, чтобы использовать 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