Как загрузить рекордсет в массив
Автор 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

Но его сообщение затерялось где-то в глубинах форума, вот я и решил освежить сведения.


Просмотров: 108

  Ваш коментарий будет первым

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code