上述范例使用了for each...in 的循环结构,如下所示:
for each rowtemp in
dsdataset.tables("members").rows(shti).getchildrows("mo")
response.write("<br>订单日期: " & rowtemp("orderdate") & _
" / 订购产品: " & rowtemp("productname") & _
" / 产品单价: " & rowtemp("unitprice") & _
" / 订购数量: " & rowtemp("quantity") & _
" / 小计: " & rowtemp("total"))
next
在执行for each...in 循环结构时,会将in 后面的集合对象中第一个对象的内存地址从内存取出,并由for each 后面的变量接收;遇到next 叙述时则取出下一个在集合对象中的项目,并将内存地址给for each 后面的变量接收,直到集合对象中的所有对象全部被取出完毕为止。利用foreach...in 这种循环结构的好处是可以让我们以单一的变量名称,就可以参考到所有在集合中的对象。下列插图中假设有一个colletions 集合,并群组了三个对象;所以我们可以使用foreach...in 的循环结构将集合对象中,每一个项目的内存地址一一取出,并存入obja 对象型态的变量中来控制这些对象:

故上述程序执行时将dsdataset.tables("members").rows(shti).getchildrows("mo") 集合中的第一个子关联的记录取回,并放入rowtemp 这个存放datarow 型态的对象变量中,所以我们就可以利用rowtemp 这个变量来控制集合中的第一个对象;遇到next 叙述后再取出集合中的下一个对象的内存地址,直到集合中的项目被取完为止。
利用关联将父关联记录取出
下列范例利用datarow 对象的getparentrow 方法取得orders 订单记录的父关联记录,并指定所要取出的字段为userid:
<%@import namespace=system.data.ado%>
<%@import namespace=system.data%>
<script language="vb" runat="server">
sub page_load(sender as object, e as eventargs)
dim strconstr as string = "provider=microsoft.jet.oledb.4.0;" & _
"data source=c:\inetpub\wwwroot\cr\ch05\myweb.mdb"
dim strcomstr as string = "select * from members"
dim dsca as adodatasetcommand = new adodatasetcommand(strcomstr,
strconstr)
dim dsdataset as dataset = new dataset()
dsca.filldataset(dsdataset, "members")
dsca.selectcommand.commandtext = "select * from orders"
dsca.filldataset(dsdataset, "orders")
dsdataset.relations.add("mo",
dsdataset.tables(0).columns("userid"), _
dsdataset.tables(1).columns("userid"))
dim rowtemp as datarow
for each rowtemp in dsdataset.tables("orders").rows
response.write("订单: 订单日期: " & rowtemp("orderdate") & _
" / 订购产品: " & rowtemp("productname") & _
" / 产品单价: " & rowtemp("unitprice") & _
" / 订购数量: " & rowtemp("quantity") & _
" / 小计: " & rowtemp("total") & "<br>" & _
"下单使用者: " & rowtemp.getparentrow("mo")("userid") & "<p>")
next
end sub
</script>
