在数据的关系表示形式中,各个表都包含使用一个列或一组列来相互关联的行。 在 ADO.NET DataSet中,表之间的关系是使用 a DataRelation实现的。 创建 DataRelation 时,列的父子关系只能通过关系进行管理。 表和列是单独的实体。 在 XML 提供的数据的分层表示形式中,父子关系由包含嵌套子元素的父元素表示。
为了便于在DataSet与XmlDataDocument同步或通过WriteXml写入为XML数据时嵌套子对象,DataRelation公开一个Nested属性。 将DataRelation的Nested属性设置为true时,关系的子行将在以 XML 数据形式写入或与 XmlDataDocument 同步时嵌套在父列内。 默认情况下,DataRelation的Nested属性默认是false。
例如,请考虑以下 数据集。
' Assumes connection is a valid SqlConnection.
Dim customerAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT CustomerID, CompanyName FROM Customers", connection)
Dim orderAdapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT OrderID, CustomerID, OrderDate FROM Orders", connection)
connection.Open()
Dim dataSet As DataSet = New DataSet("CustomerOrders")
customerAdapter.Fill(dataSet, "Customers")
orderAdapter.Fill(dataSet, "Orders")
connection.Close()
Dim customerOrders As DataRelation = dataSet.Relations.Add( _
"CustOrders", dataSet.Tables("Customers").Columns("CustomerID"), _
dataSet.Tables("Orders").Columns("CustomerID"))
// Assumes connection is a valid SqlConnection.
SqlDataAdapter customerAdapter = new SqlDataAdapter(
"SELECT CustomerID, CompanyName FROM Customers", connection);
SqlDataAdapter orderAdapter = new SqlDataAdapter(
"SELECT OrderID, CustomerID, OrderDate FROM Orders", connection);
connection.Open();
DataSet dataSet = new DataSet("CustomerOrders");
customerAdapter.Fill(dataSet, "Customers");
orderAdapter.Fill(dataSet, "Orders");
connection.Close();
DataRelation customerOrders = dataSet.Relations.Add(
"CustOrders", dataSet.Tables["Customers"].Columns["CustomerID"],
dataSet.Tables["Orders"].Columns["CustomerID"]);
由于DataRelation对象的Nested属性未为此数据集设置为true,因此当子DataSet对象表示为 XML 数据时,不会嵌套在父元素中。 转换包含具有非嵌套数据关系的相关DataSet的 XML 表示形式可能会导致性能缓慢。 建议您嵌套数据关系。 为此,请将 Nested 属性设置为 true。 然后在 XSLT 样式表中编写代码,该样式表中使用从上到下分层 XPath 查询表达式查找和转换数据。
下面的代码示例显示了调用 WriteXmlDataSet 的结果。
<CustomerOrders>
<Customers>
<CustomerID>ALFKI</CustomerID>
<CompanyName>Alfreds Futterkiste</CompanyName>
</Customers>
<Customers>
<CustomerID>ANATR</CustomerID>
<CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
</Customers>
<Orders>
<OrderID>10643</OrderID>
<CustomerID>ALFKI</CustomerID>
<OrderDate>1997-08-25T00:00:00</OrderDate>
</Orders>
<Orders>
<OrderID>10692</OrderID>
<CustomerID>ALFKI</CustomerID>
<OrderDate>1997-10-03T00:00:00</OrderDate>
</Orders>
<Orders>
<OrderID>10308</OrderID>
<CustomerID>ANATR</CustomerID>
<OrderDate>1996-09-18T00:00:00</OrderDate>
</Orders>
</CustomerOrders>
请注意,元素 Customers 和 Orders 元素显示为同级元素。 如果希望Orders元素显示为各自的父元素的子元素,则需要将DataRelation的Nested属性设置为true,并添加以下内容:
customerOrders.Nested = True
customerOrders.Nested = true;
以下代码显示了生成的输出的外观,其中 Orders 元素嵌套在各自的父元素中。
<CustomerOrders>
<Customers>
<CustomerID>ALFKI</CustomerID>
<Orders>
<OrderID>10643</OrderID>
<CustomerID>ALFKI</CustomerID>
<OrderDate>1997-08-25T00:00:00</OrderDate>
</Orders>
<Orders>
<OrderID>10692</OrderID>
<CustomerID>ALFKI</CustomerID>
<OrderDate>1997-10-03T00:00:00</OrderDate>
</Orders>
<CompanyName>Alfreds Futterkiste</CompanyName>
</Customers>
<Customers>
<CustomerID>ANATR</CustomerID>
<Orders>
<OrderID>10308</OrderID>
<CustomerID>ANATR</CustomerID>
<OrderDate>1996-09-18T00:00:00</OrderDate>
</Orders>
<CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
</Customers>
</CustomerOrders>