Класически ASP - 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