Compartir a través de


DataRelations anidadas

En una representación relacional de datos, las tablas individuales contienen filas que están relacionadas entre sí por una columna o un conjunto de columnas. En el DataSet de ADO.NET, la relación entre tablas se implementa mediante una DataRelation. Cuando crea una DataRelation, las relaciones primaria-secundaria de las columnas se administran sólo mediante la relación. Las tablas y las columnas son entidades independientes. En la representación jerárquica de los datos proporcionada por XML, las relaciones primaria-secundaria se representan mediante elementos primarios que contienen elementos secundarios anidados. Para facilitar el anidamiento de objetos secundarios cuando un DataSet se sincroniza con un XmlDataDocument o se escribe como XML mediante WriteXml, la DataRelation expone una propiedad Nested. Al establecer la propiedad Nested de una DataRelation como true, las filas secundarias de la relación se anidan dentro de la columna primaria cuando se escriben como datos XML o cuando se sincronizan con un XmlDataDocument. La propiedad Nested de la DataRelation es false de manera predeterminada. Por ejemplo, considere el siguiente DataSet:

Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;" & _
                                            "Integrated Security=SSPI;Initial Catalog=Northwind;")
Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn)
Dim orderDA As SqlDataAdapter = New SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", nwindConn)

nwindConn.Open()

Dim custDS As DataSet = New DataSet("CustomerOrders")
custDA.Fill(custDS, "Customers")
orderDA.Fill(custDS, "Orders")

nwindConn.Close()

Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders",
                     custDS.Tables("Customers").Columns("CustomerID"),
                     custDS.Tables("Orders").Columns("CustomerID"))
[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;" +
                                            "Integrated Security=SSPI;Initial Catalog=Northwind;");
SqlDataAdapter custDA = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn);
SqlDataAdapter orderDA = new SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", nwindConn);

nwindConn.Open();

DataSet custDS = new DataSet("CustomerOrders");
custDA.Fill(custDS, "Customers");
orderDA.Fill(custDS, "Orders");

nwindConn.Close();

DataRelation custOrderRel = custDS.Relations.Add("CustOrders",
                     custDS.Tables["Customers"].Columns["CustomerID"],
                     custDS.Tables["Orders"].Columns["CustomerID"]);

Como la propiedad Nested del objeto DataRelation no tiene el valor true para este DataSet, los objetos secundarios no se anidarán dentro de los elementos primarios cuando este DataSet se represente como datos XML.

En el siguiente ejemplo de código se muestra el resultado de llamar a WriteXml en el 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>

Hay que tener en cuenta que el elemento Customers y los elementos Orders se muestran como elementos relacionados. Si desea que los elementos Orders aparezcan como secundarios de sus respectivos elementos primarios, la propiedad Nested de la DataRelation debería ser true y tendría que agregar lo siguiente:

custOrderRel.Nested = True
[C#]
custOrderRel.Nested = true;

En el siguiente código se muestra cuál sería el resultado, con los elementos Orders anidados dentro de sus respectivos elementos primarios.

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

Vea también

XML y DataSet | Agregar una relación entre tablas | Crear y utilizar DataSets