Как загрузить рекордсет в массив |
Автор Joss | ||||||
09.10.2019 г. | ||||||
Иногда бывает необходимо загрузить содержимое рекордсета в массив для того, чтобы более эффективно его использовать. Способ, который первым приходит в голову. Создаешь динамический массив (тип Variant, ведь в рекордсете могут быть разных типов). Создаешь рекордсет. Определяешь количество записей в рекордсете. Определяешь размер динамического массива. Делаешь перебор по записям, присваивая элементам массива значение полей рекордсета. После окончания перебора закрываешь и удаляешь рекордсет. Массив для работы готов. Всё просто. Но разработчики библиотек DAO и ADO решили облегчить нашу жизнь. Они добавили в коллекцию рекордсета действие GetRows, которое как раз и обеспечивает запись рекордсета в массив одной строкой, без организации перебора по записям. Смотрим, как это реализовано в DAO
' описываем переменные Dim db As Database Dim varArray() As Variant Dim rstData As DAO.Recordset Dim strSQL As String Dim eData As Integer Dim intFields As Integer, i As Integer Dim strSotrudniki As String
Set db = CurrentDb ' задаем текст запроса strSQL = "SELECT tblSotrudniki.IdRec, tblSotrudniki.Name, " _ & "tblSotrudniki.DateR, tblSotrudniki.Familie, " _ & "tblSotrudniki.Childer, tblSotrudniki.Dolgnost, " _ & "tblSotrudniki.Zarplata " _ & "FROM tblSotrudniki;" ' открываем рекордсет Set rstData = db.OpenRecordset(strSQL) ' проверяем наличие записей If rstData.RecordCount = 0 Then rstData.Close MsgBox "Таблица пустая!" _ , 64, "Содержимое таблицы" Exit Sub End If ' число полей в запросе intFields = rstData.Fields.Count
' определяем количество записей в рекордсете rstData.MoveLast ' перемещение в конец рекордсета rstData.MoveFirst ' перемещение в начало рекордсета eData = rstData.RecordCount ' количество записей в рекордсете ReDim varArray(intFields, eData) ' устанавливаем размер динамического массива ' первый параметр - число столбцов в массиве (полей в запросе) ' второй параметр - число строк в массиве (число записей в запросе)
' сброс данных из рекордсета в массив varArray = rstData.GetRows(eData)
rstData.Close Set rstData = Nothing
Аналогично и для ADO
' описываем переменные Dim varArray() As Variant Dim rstData As ADODB.Recordset Dim strSQL As String Dim eData As Integer Dim intFields As Integer, i As Integer Dim strSotrudniki As String On Error GoTo btnRMADO_Click_Error
' задаем текст запроса strSQL = "SELECT tblSotrudniki.IdRec, tblSotrudniki.Name, " _ & "tblSotrudniki.DateR, tblSotrudniki.Familie, " _ & "tblSotrudniki.Childer, tblSotrudniki.Dolgnost, " _ & "tblSotrudniki.Zarplata " _ & "FROM tblSotrudniki;" ' число полей в запросе intFields = rstData.Fields.Count ' открываем рекордсет Set rstData = New ADODB.Recordset rstData.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic ' проверяем наличие записей If rstData.RecordCount = 0 Then rstData.Close MsgBox "Таблица пустая!" _ , 64, "Содержимое таблицы" Exit Sub End If ' число полей в запросе intFields = rstData.Fields.Count
' определяем количество записей в рекордсете eData = rstData.RecordCount ' количество записей в рекордсете ReDim varArray(intFields, eData) ' устанавливаем размер динамического массива ' первый параметр - число столбцов в массиве (полей в запросе) ' второй параметр - число строк в массиве (число записей в запросе)
' сброс данных из рекордсета в массив varArray = rstData.GetRows(eData)
rstData.Close Set rstData = Nothing
ВНИМАНИЕ!
Индекс элементов массива в VB/VBA начинается не с 1, а с 0. Использование оператора Option Base, который устанавливает заданную по умолчанию нижнюю границу для массива (0 или 1)
Option Base 1
или прямое задание нижней границы в операторе ReDim не влияет на нижнюю границу массива. Она всегда оказывается равно 0.
ReDim varArray( 1 To intFields, 1 To eData)
Так что первый элемент массива имеет индексы varArray(0, 0). Проверить значение нижней границы можно использовать функцию LBound, как это сделано в прилагаемом примере.
Примечание. Когда-то об этом писал GardenStone. http://hiprog.com/index.php?option=com_content&task=view&id=101 Но его сообщение затерялось где-то в глубинах форума, вот я и решил освежить сведения. Просмотров: 5151
|