Ответ 1
Обычная причина, по которой ваш образец не работает, заключается в том, что не была указана правильная библиотека для ADO (Tools- > References, Microsoft ActiveX Data Objects x.x Library), в противном случае это должно быть хорошо.
Я пытаюсь перенести данные из набора записей непосредственно в массив. Я знаю, что это возможно, но, в частности, я хочу сделать это в 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, которые не позволяют работать в этом типе?
Как насчет производительности? Это "дорогие" операции?
Обычная причина, по которой ваш образец не работает, заключается в том, что не была указана правильная библиотека для ADO (Tools- > References, Microsoft ActiveX Data Objects x.x Library), в противном случае это должно быть хорошо.
Следующий код работает для меня:
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 лучший выбор в большинстве случаев
В 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, вы можете просто получить к нему доступ как массив (индекс) и это действительно ДЕЙСТВИТЕЛЬНО быстро. Я не тестировал индексированный поиск, но он может быть быстрее.
Я согласен, что похоже, что это может быть справочная проблема.
Если вы собираетесь придерживаться доступа/струя, вы можете подумать о том, чтобы использовать 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