Классический АСП - BOF

Я пытаюсь запустить два цикла WHILE NOT для набора записей. Один из циклов подсчитывает количество элементов, а другой печатает результаты. Я не могу изменить SQL-запрос, поэтому мне остается использовать этот метод подсчета.

setPeopleCount = 0
While NOT rsSetContents.EOF
    setPeopleCount = setPeopleCount + 1
rsSetContents.MoveNext
Wend

While NOT rsSetContents.EOF
    Response.Write rs.Fields("exampleItem")&"<br>"
rsSetContents.MoveNext
Wend

Моя проблема заключается в запуске двух циклов. После того, как первый цикл завершил подсчет, курсор записи находится в конце файла, поэтому, когда необходимо запустить следующий цикл, этого не произойдет, потому что EOF истинен.

Как я могу сбросить курсор обратно в начало файла, чтобы мог работать второй цикл?


person TheCarver    schedule 20.12.2011    source источник
comment
Зачем вам нужен счет в первую очередь?   -  person John Saunders    schedule 21.12.2011
comment
Почему бы вам не получить счет в отдельном выражении, таком как SELECT COUNT? Или даже используйте GetRows() и используйте UBound(GetRowsArray,2), чтобы получить количество записей.   -  person Control Freak    schedule 22.12.2011


Ответы (3)


Вы можете использовать MoveFirst.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms677527(v=vs.85).aspx

person Jonathan Allen    schedule 20.12.2011
comment
Спасибо, считайте себя галочкой (когда 7 минут истекли) - person TheCarver; 21.12.2011

Не могли бы вы рассчитывать на нижнюю петлю? Или, возможно, прочитайте записи в массиве объектов, после чего вы можете перебирать его столько раз, сколько хотите.

person RockThunder    schedule 20.12.2011
comment
К сожалению, нет, мне нужно использовать счетчик до начала второго цикла. Я только что использовал rs.MoveFirst, и это сработало. Спасибо, в любом случае - person TheCarver; 21.12.2011

MoveFirst требует правильного курсора в наборе записей - если, например, вы перейдете на другую базу данных, курсор по умолчанию может измениться, и код может завершиться ошибкой.

Я бы посоветовал вам сохранять значения во время подсчета, таким образом, сохраните второй цикл:

setPeopleCount = 0
Dim exampleItems()
ReDim exampleItems(-1)
While NOT rsSetContents.EOF
    setPeopleCount = setPeopleCount + 1
    ReDim Preserve exampleItems(UBound(exampleItems) + 1)
    exampleItems(UBound(exampleItems)) = rs("exampleItem")
    rsSetContents.MoveNext
Wend

'instead of a loop, just this:
Response.Write(Join(exampleItems, "<br />"))
person Shadow Wizard Wearing Mask V2    schedule 21.12.2011