2

我有一个带有简单 html 表的经典 ASP 页面,我想根据从数据库中提取的未知数量的记录循环表行,但是,当我使用 do/while 循环循环记录时,我得到说明 BOF 或 EOF 为 True 的错误。我希望表格的每一行都交替背景颜色(我在 CSS 中设置的颜色)。

<% do while not rsTest.eof %>
<tr class="odd">
<td colspan="5"><%=(rsTest.Fields.Item("field").Value)%></td>
</tr>

<% rsTest.moveNext
if not rsTest.eof then 
count = count + 1 %>
<tr class="even">
<td colspan="5"><%=(rsTest.Fields.Item("field").Value)%></td>
</tr>
<% end if %>

<% count = count + 1 
rsTest.moveNext 
loop %>

根据浏览器的说法,错误发生在循环之前的最后一个“rsRoster.moveNext”上。如果从数据库中提取的记录数为偶数,则循环不会出错,但如果提取的记录数为奇数,则循环会出错。我尝试插入一些“如果 EOF 然后什么都没有,否则执行代码”,但是当我这样做时,检查 EOF 的代码似乎被忽略了。任何建议,将不胜感激。

4

4 回答 4

3

我知道我对这个生疏了,但试试这个:

<% 
  Dim oddFlag
  oddFlag = 1
  do while not rsTest.eof 
  if oddFlag=1 Then 
    oddFlag=0
    Response.write("<tr class='odd'>")
    Response.write("<td colspan='5'>")
    Response.write(rsTest.Fields.Item("field").Value)
    Response.write("</td></tr>")
  else 
    oddFlag=1 
    Response.write("<tr class='even'>")
    Response.write("<td colspan='5'>")
    Response.write(rsTest.Fields.Item("field").Value)
    Response.write("</td></tr>")
  end if
  rsTest.moveNext 
 loop 
%>
于 2013-11-15T03:32:53.133 回答
2

由于其他答案没有提到这一点:您的代码的问题是您执行了两次 MoveNext,而第二个没有测试第一个是否已经到达 EOF。

无论如何,这是一种不必要的复杂颜色交替方式。

dim i, rs
'... database stuff, table header, etc.
i = 0
Do Until rs.EOF
   i = i + 1
   Response.Write "<tr class='"
   If i Mod 2 = 0 Then Response.Write "even" Else Response.Write "odd" End If
   Response.Write "'>"
   '... write out the actual content of the table
   Response.Write "</tr>"
   rs.Movenext
Loop
'... clean up database, close table

使用此方法,您的计数器变量 ( i) 可用作实际的计数器- 例如,如果您想在最后写出“返回的行数”消息,您可以。

于 2013-11-15T15:08:07.463 回答
1

这里有点草率,但这就是我通常会这样做的方式:

<%
Dim i
i = 1
do while not rsTest.eof
If i = 1 Then %>
<tr class="odd">
<% Else %>
<tr class="even">
<% End If %>
<td colspan="5"><%=(rsTest.Fields.Item("field").Value)%></td>
</tr>
<% 
i = i + 1
If i = 3 Then i = 1
count = count + 1
rsTest.moveNext 
loop %>
于 2013-11-15T03:09:19.020 回答
1

为什么不直接使用:

While not rs.EOF
'stuff
rs.movenext
wend

或确保:

if not rs.eof then
   while not rs.eof
    'stuff
   rs.movenext
   wend
end if

更好的方法是缓存所有内容并保持连接非常短:

'... set global base (include file)

dim dbcon, rs, rsSQL, rsArray

Function openCon()
    set dbcon = server.createobject("ADODB.Connection")
    dbcon.open Application("YOURDB_Connectionstring")
End Function

Function closeCon()
    dbcon.Close
    set dbcon = nothing
End Function

function rw(stringwriteshortcut)
    response.write(stringwriteshortcut)
end function
'... end global


'... Database interaction:
rsSQL = "SELECT item1, item2 FROM table where ID = 1"

openCon()
set rs = dbcon.execute(rsSQL)
if not rs.eof then
    rsArray = rs.getRows();
end if
closeCon()

dim items
if isarray(rsArray) then

    for items = 0 to UBound(rsArray, 2)

        rw(rsArray(0,items) &"<br>")
        rw(rsArray(1,items) &"<br>")

    next

else
   rw("nothing there")
end if
于 2014-07-11T12:30:48.183 回答