有人可以帮我看一下这个Recordset循环中发生了什么吗?

时间:2015-03-25 14:32:35

标签: vbscript asp-classic adodb

我目前正在首次使用ASP进行编码,并已到达ADO。假设我的查询如下:

SQL = "SELECT President FROM Testing"

表格如下:

President
------------------
George Washington
John Adams
Thomas Jefferson
James Madison
James Monroe

我最初从W3获得的代码如下:

For Each x In recordset.fields                              
    Response.Write(x.name)
    Response.Write(" = ")
    Response.Write(x.value & "<br>")
Next

但是它只会返回:

President = George Washington

当我期待整张桌子的时候。直到我从W3改变它为止:

Do Until Recordset.EOF
    For Each x In recordset.fields                              
        Response.Write(x.name)
        Response.Write(" = ")
        Response.Write(x.value & "<br>")
    Next
    Response.Write("<br>")
    Recordset.MoveNext
Loop

我得到了所有的名字。有人可以帮我看看发生了什么吗?我想在第一段代码中,它会循环遍历表,直到它给了我所有的名字,但事实并非如此。差不多,“对于每个记录集字段,写下列名+等号+当前行的值,然后转到下一行行。”

或者是因为我不能正确理解记录集?

4 个答案:

答案 0 :(得分:3)

您的For Each循环枚举记录集的当前记录(vulgo“row”)的字段。您需要通过记录集向move“当前记录”指示符的另一个循环来迭代所有记录/行。那就是

Do Until recordset.EOF   'stop after the last record
  ...                    'do stuff
  recordset.MoveNext     'move to the next record
Loop

确实

答案 1 :(得分:2)

由于myself@sean-lange已在上面的评论中指出了

Fields集合仅包含当前记录的列。

所以我们的列有关于行的内容吗?

ADODB.Recordset对象包含列数据和行数据我们如何获取行?记录集的行为取决于所使用的游标,但为此我们假设我们可以来回移动。

@sean-langes类比最好,将ADODB.Recordset视为Excel电子表格,Fields集合是顶部的列。如果我们在一行中从左到右制表,我们只看到当前行的数据,以获得我们必须向下移动电子表格的下一行。 ADODB.Recordset方法提供的MoveNext()也是如此。这会告诉光标移动到下一条记录并使用行值重新填充Fields集合。

您发布的第二个示例是用于迭代ADODB.Recordset中的记录的常用技巧。让我们分解代码正在做什么;

这开始循环并告诉经典ASP继续循环包含的代码,直到光标到达.EOF(文件结束)等于True。这表示光标已经超过最终记录,并且没有更多记录要通过调用MoveNext()进行处理。

Do While Not recordset.EOF

在循环中我们有一个当前记录,所以在这种情况下我们可以访问Fields集合并枚举数据。

    For Each x In recordset.fields

键是MoveNext,它将光标移动到下一条记录,并重新填充与当前记录关联的集合,例如Fields

    recordset.MoveNext

答案 2 :(得分:0)

注意:我对VB的经验不多。第一段代码只返回George Washington的原因是因为指针在记录集中没有前进。指针固定在记录0(在数组中工作),因此,我相信,返回乔治华盛顿5次。在第二个示例中,指针在每次迭代后移动(Recordset.MoveNext),因此将打印所有名称。

第一个代码正在执行:Response.Write(x [0])5次。 第二个代码正在执行:Response.Write(x [0])移动指针 Response.Write(x [1]])等

答案 3 :(得分:0)

SQL = "SELECT President FROM Testing"

Set objRs = objConnection.Execute(SQL)

Do While Not objRs .EOF
    Response.Write objRs("President") & "<br>"
    objRs.MoveNext
Loop