Enlace de Datos con ADO .NET[Parte II]Fecha: 05/Ago/2005 (03/08/2005)
|
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 ClassLuego 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