有人可以帮我想象一下这个 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
我目前是第一次在 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
会。
因为
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