Enlace de Datos con ADO .NET

[Parte II]

Fecha: 05/Ago/2005 (03/08/2005)
Autor: Arbis Percy Reyes Paredes 
Email: bigpercynet@hotmail.com
http://percyreyes.blogspot.com 

Joven desarrollador de aplicaciones Web y Servicios Web XML en Visual Basic .NET y Visual C# .NET con bases de datos SQL Server 2000 - 2005. ¡ Los peruanos Sí podemos !

En el artículo Enlace de Datos con ADO .NET (Parte I), usted aprendió establecer un enlace de datos sencillo  y manejar una relación de uno a uno, pues esta vez  explicaré cómo es la funcionalidad de una relación de varios a varios, las cuales generalmente se conectan a  través de una tercera tabla que facilita la integridad de los datos.

Explorar tres o más tablas es tan sencillo como trabajar con dos. Creo que la mejor manera de detallarte estos puntos es mediante un ejemplo, es así que, implementaremos una aplicación donde trabajaremos con cuatro tablas.

Debe agregar tres controles sobre el formulario. Un control ComboBox, un control ListBox y un Control RitchTextBox.  Para el control ComboBox  debe  establecer la propiedad DataSource a DsNorthwind, la propiedad DisplayMember a CompanyName y la propiedad ValueMember a CustomerId. Luego se agregará funcionalidad para mostrar la lista de pedidos relacionados en el cuadro de lista, además, mostraremos el número total de pedidos del cliente seleccionado como título del formulario. Otra de la manera de hacer lo anterior para el cuadro de lista es enlazando los registros relacionados con las propiedades DataSource, DataMember y ValueMember. El cuadro de texto enriquecido mostrará los detalles de pedido cada vez que se seleccione un pedido específico en el cuadro de lista.

En resumen, la funcionalidad de nuestro ejemplillo es de la siguiente manera: Primero cargaremos todos los datos del campo CompanyName de la tabla Customers en un control ComboBox, cuando seleccionemos un item de este control pues en un control Listbox debe cargarse todos los Order Id de dicho cliente. A Continuación, cuando nosotros seleccionemos pedido (OrderId) del control ListBox, debe visualizarse en un control RitchTextBox todos los detalles de dicho pedido incluyendo el nombre del producto. De esta manera hemos podido manejar cuatro tablas relacionadas con suma sencillez y facilidad.

Para conocer cómo se trabaja con más de dos tablas, deberá agregar cuatro tablas al conjunto de datos dsNorthwind. Al seleccionar un pedido del cuadro de lista, aparacerás los detalles correspondientes al mismo en  el cuadro de texto enriquecido. Para cumplir con las reglas de restricción, deberá eliminar la relación de datos existente. Podrá volver a crearla más tarde.

Para  crear los adaptadores de datos y las conexiones se arrastra la tabla de clientes Customers desde el Explorador de servidores hasta el formulario. En la bandeja de componentes aparecerán una conexión y un adaptador de datos. A continuación seleccionaremos la conexión y se establece la propiedad Name como dcNorthwind. Haremos lo mismo con el adaptador de datos y estableceremos la propiedad Name como daCustomers.

Luego procederemos a realizar la creación de los demás adaptadores para las tablas Orders, OrderDetails y Products de manera similar a la tabla Customers, quedando en la bandeja de componentes lo siguiente:

Además en la bandeja de componentes existe un componente denominada DsNorthwind1, pues esto es nuestro conjunto de datos generado para almacenar las tablas Customers, Orders, OrderDetails y Products.

Para generar este conjunto de datos DsNorthwind1 seleccione el menú Datos y a continuación Generar conjunto de datos, entonces aparecerá el cuadro de diálogo  Generar conjunto de datos como se muestra a continuación.

 

Ahora en la bandeja de componentes debió aparecer nuestro conjunto de datos. Además podemos verificar que nuestro conjunto de datos contenga las tablas señaladas, para esto hacemos click derecho sobre el conjunto de datos y luego Propiedades del conjunto de datos, aparacerá esta ventana de diálogo donde observamos que en realidad sí contiene dichas tablas.

La relación entre las tablas de datos no se establece automáticamente cuando éste se genera. Esta relación se puede crear programáticamente o visualmente, utilizando el diseñador XML. Nosotros usaremos por esta vez  el Diseñador.

Para crear la relación entre las tablas Clientes y Pedidos hacemos doble click en el archivo dsNorthwind.xsd que se encuentra en el explorador de soluciones, entonces se abrirá el disenañor XML, pudiendo visualizar lo siguiente (las relaciones que observa con creadas más adelante, usted tan sólo debe ver todas las tablas aún no relacionadas):

Fig. dsNorthwind

Existe la ficha Esquema XML en el  Cuadro de Herramientas, la cual nos servirá para crear las distintas relaciones entre las tablas de nuestro conjunto de datos.

Desde la ficha Esquema XML del Cuadro de Herramientas, arrastré una relación hasta la tabla Orders y en el cuadro de diálogo Editar Relación, establezca las siguientes propiedades:

A continuación hacemos click en el botón aceptar para crear la relación y cerrar el cuadro de diálogo.

De la misma manera debe usted crear las demás relaciones necesarias como se observa en la Fig. dsNorthwind. Es decir debe crear la relación entre las tablas Orders y Order Details y la relación entre las tablas Order Details y Products. Una vez hecho esto, estará listo para revisar el siguiente código  en Visual Basic .NET, pero antes te explico la funcionalidad de cada parte.

cbCustomers_SelectedIndexChanged: Llamaremos al método GetChildRows, en función del cliente seleccionado en el cuadro combinado.Todos los registros relacionado en la tabla pedidos se asignarán a la matriz de filas de datos llamada drOrders.

lstOrders_SelectedIndexChanged: Usando el método GetChildRows en función del pedido seleccionado en el cuadro de lista. Todos los registros relacionados en la tabla de detalles de pedidos se asignarán a la matriz de la fila de datos llamada drOrderDetails, finalmente en el cuadro de texto enriquecido aparacerán el contenido de cada fila de datos.

Imports System.Data.SqlClient

Public Class Form1
    Inherits System.Windows.Forms.Form
    'código generado por el diseñador de windows

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load

        Me.DsNorthwind1.EnforceConstraints = False
        Me.daCustomers.Fill(Me.DsNorthwind1)
        Me.daOrders.Fill(Me.DsNorthwind1)
        Me.daOrderDetails.Fill(Me.DsNorthwind1)
        Me.daProducts.Fill(Me.DsNorthwind1)
        Me.DsNorthwind1.EnforceConstraints = True

    End Sub

    Private Sub cbCustomers_SelectedIndexChanged(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cbCustomers.SelectedIndexChanged

        Dim SelectedCustomerId As String = New String(Me.cbCustomers.SelectedValue)
        Dim drSelectedCustomer As DataRow = Me.DsNorthwind1.Customers.FindByCustomerID(SelectedCustomerId)
        Dim drOrders As DataRow()
        'no produce efecto aparente debido a que no se ha realizado cambios
        drOrders = drSelectedCustomer.GetChildRows("CustomersOrders", DataRowVersion.Original)
        Me.Text = drOrders.Length.ToString() & " pedidos de " & SelectedCustomerId
        Me.lstOrders.Items.Clear()
        Dim Order As DataRow
        For Each Order In drOrders
            Me.lstOrders.Items.Add(Order("OrderID"))
        Next

    End Sub

    Private Sub lstOrders_SelectedIndexChanged(ByVal sender As System.Object, ByVal _
        e As System.EventArgs) Handles lstOrders.SelectedIndexChanged

        Me.rtbDetails.Clear()
        Dim SelectedOrderId As Integer = CType(Me.lstOrders.SelectedItem, Integer)
        Dim drSelectedOrder As DataRow = Me.DsNorthwind1.Orders.FindByOrderID(SelectedOrderId)
        Dim drOrderDetails() As DataRow
        drOrderDetails = drSelectedOrder.GetChildRows("OrdersOrderDetails", DataRowVersion.Original)
        Dim Details As String = ""
        Dim drDetails As DataRow
        Dim dcDetails As DataColumn
        For Each drDetails In drOrderDetails

            Details &= "Nombre de producto: ".ToUpper & _
            CType(drDetails.GetParentRow("ProductsOrderDetails")("ProductName"), String) & ControlChars.CrLf

            For Each dcDetails In drDetails.Table.Columns
                Details &= dcDetails.ColumnName & ": "
                Details &= drDetails(dcDetails).ToString.ToUpper
                Details &= ControlChars.CrLf
            Next
            Details &= ControlChars.CrLf
        Next
        Me.rtbDetails.Text = Details

    End Sub
End Class

Luego terminar lo anterior, descargue el Fichero con el código de ejemplo, proceda a ejecutar la aplicación cuyo aspecto debe ser como se aprecia en la siguiente imagen....

No olvides de darme tu voto en PanoramaBox, pues es una manera de animarme a seguir compartiendo contigo lo que voy aprendiendo.

Saludos desde Trujillo !!!


Espacios de nombres usados en el código de este artículo:

System.Data
System.Data.Client


Fichero con el código de ejemplo: Percynet_EnlaceDatos_ParteII.zip - Tamaño 29 KB


ir al índice