【问题标题】:Classic ASP do while loop showing error经典 ASP do while 循环显示错误
【发布时间】:2013-11-15 03:00:47
【问题描述】:

我有一个带有简单 html 表的经典 ASP 页面,我想根据从数据库中提取的未知数量的记录循环表行,但是,当我使用 do/while 循环循环记录时,我收到一条错误消息,指出 BOF 或 EOF 为真。我希望表格的每一行都交替使用背景颜色(我在 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 的代码似乎被忽略了。任何建议将不胜感激。

【问题讨论】:

    标签: sql asp-classic do-while


    【解决方案1】:

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

    <% 
      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 
    %>
    

    【讨论】:

    • 这似乎有效。我对它的逻辑有点困惑,特别是“if”语句的第一部分,其中“ifoddFlag = 1 thenoddFlag=0”。你能解释一下这是如何解释的逻辑吗?
    • 我从oddFlag=1 开始,这意味着在这种情况下我将从奇数行开始。因此,当它是奇数行时,它将显示奇数类行,然后将 oddFlag 变为 0,这意味着在下一个循环中它将用于偶数行。因此,在下一个循环中,它将显示偶数行,然后将oddFlag 设置为 1,以便下一个循环再次为奇数。以此类推。
    【解决方案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) 可用作实际的,嗯,counter - 例如,如果您想在以下位置写出“返回的行数”消息最后,你可以。

    【讨论】:

    • 是的,确实更好。
    • 另外人们需要知道 UNTIL 和 WHILE 之间的区别。 WHILE 获取最后一条记录,而 UNTIL 通常会因为最后一条记录而停止(不包括在记录集中)。可能是偶数工作但奇怪的原因不是。
    • 请注意,现在,你可以用几行 CSS 来实现颜色的交替,所以在 ASP 中不需要这样做......
    【解决方案3】:

    这里有点草率,但我通常会这样做:

    <%
    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 %>
    

    【讨论】:

    • 从数据库调用的记录数未知。可能有 3 条记录,也可能有 100 条记录。我不想为每个可能的奇数声明“i”。
    • 你不是。 i 从 1 递增到 2,然后再回到 1。您不需要知道数据库中有多少条记录。
    【解决方案4】:

    为什么不直接使用:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多