Метод Recordset.GetRows (DAO)
Область применения: Access 2013, Office 2013
Извлекает несколько строк из объекта Recordset.
Синтаксис
expression . GetRows(NumRows)
expression: переменная, представляющая объект Recordset.
Параметры
Имя |
Обязательный/необязательный |
Тип данных |
Описание |
---|---|---|---|
NumRows |
Необязательный |
Variant |
Количество возвращаемых строк. |
Возвращаемое значение
Variant
Примечания
Используйте метод GetRows, чтобы скопировать записи из объекта Recordset.
GetRows возвращает двумерный массив. Первый подстрочный знак определяет поле, а второй определяет номер строки. Например, intField
представляет поле, а intRecord
определяет номер строки:
avarRecords(intField, intRecord)
Чтобы получить значение первого поля во второй возвращенной строке, используйте следующий код:
field1 = avarRecords(0,1)
Чтобы получить значение второго поля в первой строке, используйте следующий код:
field2 = avarRecords(1,0)
Переменная avarRecords автоматически становится двумерным массивом, когда метод GetRows возвращает данные.
Если запрошено больше строк, чем доступно, метод GetRows возвращает только число доступных строк. Можно использовать функцию UBound в Visual Basic для приложений, чтобы определить количество строк, фактически возвращенных методом GetRows, так как размер массива соответствует числу возвращаемых строк. Например, если результаты возвращаются в виде значения Variant с именем varA, можно использовать следующий код, чтобы определить число фактически возвращенных строк:
numReturned = UBound(varA,2) + 1
Нужно использовать "+ 1", так как первая возвращенная строка находится в элементе 0 массива. Число строк, которые можно получить ограничено объемом доступной памяти. Не следует использовать метод GetRows для извлечения всей таблицы в массив, если она большая.
Так как GetRows возвращает все поля объекта Recordset в массив, в том числе поля MEMO и LONG BINARY, может потребоваться использовать запрос, ограничивающий возвращаемые поля.
После вызова метода GetRows текущая запись располагается в следующей непрочитанной строке. То есть метод GetRows действует на текущую запись аналогично методу Move numrows.
Если вы пытаетесь извлечь все строки с помощью нескольких вызовов GetRows, используйте свойство EOF, чтобы убедиться, что вы находитесь в конце объекта Recordset. Метод GetRows возвращает меньшее число, чем запрошено, если он находится в конце объекта Recordset или не может извлечь строку из запрошенного диапазона. Например, если вы пытаетесь получить 10 записей, но не удается получить пятую запись, метод GetRows вернет четыре записи и сделает пятую запись текущей. Это не приводит к возникновению ошибки во время выполнения. Это может произойти, если другой пользователь удаляет записи в объекте Recordset типа "Динамический набор". См. пример, демонстрирующий способ обработки такой ситуации.
Пример
В этом примере используется метод GetRows для получения указанного числа строк из объекта Recordset и для заполнения массива итоговыми данными. Метод GetRows возвращает меньше строк, чем нужно в двух случаях: если достигнуто значение EOF или метод GetRows пытается получить запись, удаленную другим пользователем. Функция возвращает значение False только при возникновении второго случая. Функция GetRowsOK необходима для запуска этой процедуры.
Sub GetRowsX()
Dim dbsNorthwind As Database
Dim rstEmployees As Recordset
Dim strMessage As String
Dim intRows As Integer
Dim avarRecords As Variant
Dim intRecord As Integer
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
Set rstEmployees = dbsNorthwind.OpenRecordset( _
"SELECT FirstName, LastName, Title " & _
"FROM Employees ORDER BY LastName", dbOpenSnapshot)
With rstEmployees
Do While True
' Get user input for number of rows.
strMessage = "Enter number of rows to retrieve."
intRows = Val(InputBox(strMessage))
If intRows <= 0 Then Exit Do
' If GetRowsOK is successful, print the results,
' noting if the end of the file was reached.
If GetRowsOK(rstEmployees, intRows, _
avarRecords) Then
If intRows > UBound(avarRecords, 2) + 1 Then
Debug.Print "(Not enough records in " & _
"Recordset to retrieve " & intRows & _
" rows.)"
End If
Debug.Print UBound(avarRecords, 2) + 1 & _
" records found."
' Print the retrieved data.
For intRecord = 0 To UBound(avarRecords, 2)
Debug.Print " " & _
avarRecords(0, intRecord) & " " & _
avarRecords(1, intRecord) & ", " & _
avarRecords(2, intRecord)
Next intRecord
Else
' Assuming the GetRows error was due to data
' changes by another user, use Requery to
' refresh the Recordset and start over.
If .Restartable Then
If MsgBox("GetRows failed--retry?", _
vbYesNo) = vbYes Then
.Requery
Else
Debug.Print "GetRows failed!"
Exit Do
End If
Else
Debug.Print "GetRows failed! " & _
"Recordset not Restartable!"
Exit Do
End If
End If
' Because using GetRows leaves the current record
' pointer at the last record accessed, move the
' pointer back to the beginning of the Recordset
' before looping back for another search.
.MoveFirst
Loop
End With
rstEmployees.Close
dbsNorthwind.Close
End Sub
Function GetRowsOK(rstTemp As Recordset, _
intNumber As Integer, avarData As Variant) As Boolean
' Store results of GetRows method in array.
avarData = rstTemp.GetRows(intNumber)
' Return False only if fewer than the desired number of
' rows were returned, but not because the end of the
' Recordset was reached.
If intNumber > UBound(avarData, 2) + 1 And _
Not rstTemp.EOF Then
GetRowsOK = False
Else
GetRowsOK = True
End If
End Function