Поделиться через


Метод 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