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