Dela via


Kapsla datarelationer

I en relationsrepresentation av data innehåller enskilda tabeller rader som är relaterade till varandra med hjälp av en kolumn eller uppsättning kolumner. I ADO.NET DataSetimplementeras relationen mellan tabeller med hjälp av en DataRelation. När du skapar en DataRelation hanteras kolumnernas överordnade och underordnade relationer endast via relationen. Tabellerna och kolumnerna är separata entiteter. I den hierarkiska representationen av XML, representeras förälder-barn relationerna av förälderelement som innehåller kapslade barnelement.

För att underlätta kapsling av underordnade objekt när en DataSet synkroniseras med en XmlDataDocument eller skrivs som XML-data med WriteXml exponerar DataRelation en Kapslad egenskap. Om du anger egenskapen Kapslad för en DataRelation till true blir de underordnade raderna i relationen kapslade i den överordnade kolumnen när de skrivs som XML-data eller synkroniseras med en XmlDataDocument. Egenskapen Nested för DataRelation är false som standard.

Tänk till exempel på följande DataSet.

' 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"]);  

Eftersom egenskapen Kapslad för DataRelation-objektet inte är inställd på true för den här DataSeten kapslas inte de underordnade objekten i de överordnade elementen när datauppsättningen representeras som XML-data. Att omvandla XML-representationen av en DataSet som innehåller relaterade DataSet med icke-kapslade datarelationer kan orsaka låg prestanda. Vi rekommenderar att du kapslar datarelationerna. Det gör du genom att ange egenskapen Kapslad till true. Skriv sedan kod i XSLT-formatmallen som använder hierarkiska XPath-frågeuttryck uppifrån och ned för att hitta och transformera data.

I följande kodexempel visas resultatet från att anropa 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>  

Observera att elementet Kunder och elementen Beställningar visas som syskonelement. Om du vill att elementen Orders ska visas som underordnade till sina respektive överordnade element måste egenskapen Nested för DataRelation anges till true och du lägger till följande:

customerOrders.Nested = True  
customerOrders.Nested = true;  

Följande kod visar hur de resulterande utdata skulle se ut, med elementen Beställningar kapslade i respektive överordnade element.

<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>  

Se även