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

Can someone help me visualize what's happening in this Recordset loop?

我目前是第一次在 ASP 中编码,并且已经到达 ADO。假设我有一个查询如下:

SQL = "SELECT President FROM Testing"

而table如下:

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

但后来只有 returns:

President = George Washington

当我期待整个table。直到我从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

我得到了所有的名字。有人可以帮我想象发生了什么吗?我在第一段代码中想到,它会循环遍历 table 直到它给了我所有的名字,但事实并非如此。差不多,"For each recordset field, write the column name + equal sign + the value of the current row, then move on to the next row."

还是因为我没有正确理解记录集?

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

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

您的 For Each 循环枚举记录集的当前记录 (vulgo "row") 的字段。您需要另一个循环 move "current record" 指示符通过记录集迭代所有 records/rows。就是这样

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

会。

因为 and 已经在上面的评论中指出。

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

所以我们有列,那行呢?

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

@sean-langes 类比是最好的,将 ADODB.Recordset 想象成一个 Excel 电子表格,而 Fields 集合是顶部的列。如果我们从左到右横跨一行,我们只会看到当前行的数据,要获取下一行,我们必须向下移动电子表格。对于 MoveNext() 方法提供的 ADODB.Recordset 也是如此。这告诉游标移动到下一条记录并用行值重新填充 Fields 集合。

您发布的第二个示例是用于遍历 ADODB.Recordset 中的记录的常用技术。让我们分解一下代码的作用;

这将开始循环并告诉经典 ASP 继续循环包含的代码,直到光标到达等于 True.EOF(文件结尾)。这表明光标已经超过最后一条记录,并且没有更多的记录可以通过调用 MoveNext().

来处理
Do While Not recordset.EOF

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

    For Each x In recordset.fields

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

    recordset.MoveNext
SQL = "SELECT President FROM Testing"

Set objRs = objConnection.Execute(SQL)

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