Imbrication de DataRelations
Dans une représentation relationnelle des données, chaque table contient des lignes reliées aux lignes d'autres tables par une colonne ou un ensemble de colonnes. Dans l'objet DataSet ADO.NET, la relation entre les tables est implémentée à l'aide d'un objet DataRelation. Quand vous créez un DataRelation, les relations parent-enfant des colonnes sont managées uniquement via la relation. Les tables et les colonnes constituent des entités distinctes. Dans la représentation hiérarchique des données proposée par XML, les relations parent-enfant sont représentés sous forme d'éléments parents contenant des éléments enfants imbriqués.
Pour faciliter l’imbrication des objets enfants quand un DataSet est synchronisé avec un objet XmlDataDocument ou écrit sous forme de données XML à l’aide de WriteXml, le DataRelation expose une propriété Nested. Quand il est écrit sous forme de données XML ou synchronisé avec un XmlDataDocument, le fait d’assigner la valeur true à la propriété Nested d’un DataRelation entraîne l’imbrication dans la colonne parent des lignes enfants de la relation. Par défaut, la propriété Nested du DataRelation a la valeur false.
Examinons, par exemple, le DataSet suivant.
' 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"]);
Étant donné que la propriété Nested de l’objet DataRelation n’a pas la valeur true pour ce DataSet, les objets enfants ne sont pas imbriqués dans les éléments parents quand ce DataSet est représenté sous forme de données XML. La transformation de la représentation XML d’un DataSet contenant des DataSets connexes avec des relations de données non imbriquées peut entraîner un ralentissement des performances. Il est recommandé d'imbriquer les relations de données. Pour cela, attribuez à la propriété Nested la valeur true. Puis, écrivez le code dans la feuille de style XSLT qui utilise des expressions de requête XPath hiérarchisées de haut en bas pour rechercher et transformer les données.
L’exemple de code suivant illustre le résultat obtenu après appel du WriteXml sur le DataSet.
<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>
Notez que l’élément Customers et les éléments Orders sont représentés en tant qu’éléments frères. Si vous souhaitiez que les éléments Orders apparaissent comme les enfants de leurs éléments parents respectifs, vous devez assigner la valeur true à la propriété Nested du DataRelation et ajouter ce qui suit :
customerOrders.Nested = True
customerOrders.Nested = true;
Le code suivant montre la sortie que vous obtiendriez, avec les éléments Orders imbriqués dans leurs éléments parents respectifs.
<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>