上述范例使用了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:InetPubwwwrootCRCH05MyWeb.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>