Tutorial: Guardar datos de tablas de datos relacionadas (actualización jerárquica)

Guardar los datos de una aplicación de nuevo en la base de datos es bastante sencillo cuando se trabaja con una sola tabla de datos y no hay que tener en cuenta restricciones de claves externas. Pero cuando se necesita guardar datos de un conjunto de datos que contiene dos o más tablas de datos relacionadas, debe enviar los cambios a la base de datos con un orden específico para no infringir las restricciones. Cuando se actualizan los datos modificados en las tablas relacionadas, puede proporcionar la lógica de programación para extraer los subconjuntos específicos de cada tabla de datos y enviar las actualizaciones a la base de datos en el orden correcto, o puede usar el componente TableAdapterManager.

Este tutorial muestra cómo guardar los datos relacionados usando el componente TableAdapterManager. Para más información sobre cómo codificar manualmente las actualizaciones de tablas de datos relacionadas, vea Tutorial: Guardar datos en una base de datos (Varias tablas).

Requisitos previos

Para completar este tutorial, necesita lo siguiente:

Crear la aplicación basada en Windows

El primer paso de este tutorial es crear una nueva aplicación basada en Windows.

Para crear la nueva aplicación basada en Windows

  1. En el menú Archivo, cree un nuevo proyecto.

    Nota

    Como en los proyectos de Visual Basic y C# se admiten actualizaciones jerárquicas, cree el nuevo proyecto en uno de estos lenguajes.

  2. Asigne al proyecto el nombre HierarchicalUpdateWalkthrough.

  3. Seleccione Aplicación de Windows Forms y haga clic en Aceptar. Para obtener más información, vea Desarrollar aplicaciones cliente con .NET Framework.

    Se crea el proyecto HierarchicalUpdateWalkthrough y se agrega al Explorador de soluciones.

Crear el conjunto de datos

Como necesita tablas relacionadas para demostrar las actualizaciones jerárquicas, el siguiente paso es crear un conjunto de datos que contiene las tablas Customers y Orders de la base de datos Northwind. Cree el conjunto de datos mediante el Asistente para configuración de orígenes de datos. Debe tener acceso a la base de datos de ejemplo Northwind para crear la conexión. Para obtener información sobre la forma de configurar la base de datos de ejemplo Northwind, vea Cómo: Instalar bases de datos de ejemplo.

Para crear el conjunto de datos

  1. En el menú Datos, haga clic en Mostrar orígenes de datos.

  2. En la ventana Orígenes de datos, haga clic en Agregar nuevo origen de datos para iniciar el Asistente para configuración de orígenes de datos.

  3. En la página Elegir un tipo de origen de datos, haga clic en Base de datos y, a continuación, haga clic en Siguiente.

  4. En la página Elegir la conexión de datos, realice una de las siguientes acciones:

    • Si existe alguna conexión de datos a la base de datos de ejemplo Northwind disponible en el cuadro de lista desplegable, haga clic en ella.

      O bien

    • Haga clic en Nueva conexión para abrir el cuadro de diálogo Agregar o modificar conexión.

  5. Si la base de datos requiere una contraseña, seleccione la opción para incluir datos confidenciales y, a continuación, haga clic en Siguiente.

  6. Haga clic en Siguiente en la página Guardar cadena de conexión en el archivo de configuración de la aplicación.

  7. Expanda el nodo Tablas en la página Elija los objetos de base de datos.

  8. Haga clic en las casillas de las tablas Customers y Orders y, a continuación, haga clic en Finalizar.

    Se crea NorthwindDataSet y se agrega al proyecto, y las tablas aparecen en la ventana Orígenes de datos.

Cambiar los controles enlazados a datos predeterminados que se crearán

Después de rellenar la ventana Orígenes de datos, puede elegir los controles que se crearán al arrastrar elementos a un formulario de Windows Forms. Para este tutorial, los datos de la tabla Customers se mostrarán en controles individuales (Detalles). Los datos de la tabla Orders se mostrarán en un control DataGridView (DataGridView).

Para establecer el control de los elementos en la ventana Orígenes de datos

  1. Expanda el nodo Customers en la ventana Orígenes de datos.

  2. Cambie los controles que se van a crear para la tabla Customers por controles individuales haciendo clic en Detalles en la lista de controles del nodo Customers. Para obtener más información, vea Cómo: Establecer el control que se creará al arrastrar desde la ventana de orígenes de datos.

    Nota

    La tabla Orders usará el control predeterminado, DataGridView.

Crear el formulario enlazado a datos

Después de elegir los controles en la ventana Orígenes de datos, cree los controles enlazados a datos arrastrando los elementos al formulario.

Para crear controles enlazados a datos para los datos Customers y Orders

  1. Arrastre el nodo Customers principal desde la ventana Orígenes de datos a Form1.

    Los controles enlazados a datos con etiquetas descriptivas aparecen en el formulario, junto con un componente TableAdapterManager, una barra de herramientas (BindingNavigator) para navegar por los registros. En la bandeja de componentes aparecen los objetos DataSet, TableAdapter y BindingSource tipados.

  2. Arrastre el nodo Orders relacionado desde la ventana Orígenes de datos hasta Form1.

    Nota

    El nodo Orders relacionado se encuentra debajo de la columna Fax de la tabla de clientes y es un nodo secundario del nodo Customers.El nodo Orders, que aparece como elemento del mismo nivel que el nodo Customers, representa todos los pedidos de la tabla.El nodo Orders, que aparece como elemento secundario del nodo Customers, representa los pedidos relacionados.

    En el formulario aparecen un control DataGridView y una barra de herramientas (BindingNavigator) para navegar por los registros. En la bandeja de componentes aparecen los objetos TableAdapter y BindingSource.

Modificar el código de guardado generado para realizar la actualización jerárquica

Guarde en la base de datos los cambios de las tablas de datos relacionadas del conjunto de datos; para ello, llame al método TableAdapterManager.UpdateAll y pase el nombre del conjunto de datos que contiene las tablas relacionadas. Por ejemplo, ejecute el método TableAdapterManager.UpdateAll(NorthwindDataset) para enviar las actualizaciones de todas las tablas de NorthwindDataset a la base de datos back-end.

Después de colocar en los elementos de la ventana Orígenes de datos, el código se agrega automáticamente al evento Form_Load para rellenar cada tabla (los métodos TableAdapter.Fill). También se agrega código al evento de clic del botón Guardar del BindingNavigator para guardar los datos desde el conjunto de datos de nuevo a la base de datos (el método TableAdapterManager.UpdateAll).

El código de guardado generado también contiene una línea de código que llama al método CustomersBindingSource.EndEdit. Más concretamente, llama al método EndEdit del primer BindingSource que se agregó al formulario. En otras palabras, el código solo se genera para la primera tabla arrastrada desde la ventana Orígenes de datos al formulario. La llamada EndEdit confirma los cambios que están en curso en los controles enlazados a datos que se estén editando en ese momento. Por lo tanto, si un control enlazado a datos aún tiene el foco y hace clic en el botón Guardar, todas las ediciones pendientes en ese control se confirman antes del guardado real (el método TableAdapterManager.UpdateAll).

Nota

El diseñador solo agrega el código BindingSource.EndEdit para la primera tabla que se coloca en el formulario.Por lo tanto, tiene que agregar una línea de código para llamar al método BindingSource.EndEdit para cada tabla relacionada en el formulario.Para este tutorial, esto significa que tiene que agregar una llamada al método OrdersBindingSource.EndEdit.

Para actualizar el código para confirmar los cambios en las tablas relacionadas antes de guardar

  1. Haga doble clic en el botón Guardar, en el BindingNavigator, para abrir Form1 en el Editor de código.

  2. Agregue una línea de código para llamar al método OrdersBindingSource.EndEdit después de la línea que llama al método CustomersBindingSource.EndEdit. El código del evento de clic del botón Guardar debe tener un aspecto similar al siguiente:

    Me.Validate()
    Me.CustomersBindingSource.EndEdit()
    Me.OrdersBindingSource.EndEdit()
    Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)
    
    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

Además de confirmar los cambios en una tabla secundaria relacionada antes de guardar los datos en una base de datos, quizás también tenga que confirmar los registros primarios recién creados antes de agregar nuevos registros secundarios a un conjunto de datos. En otras palabras, quizás tenga que agregar el nuevo registro primario (Customer) al conjunto de datos para que las restricciones de clave externa permitan agregar nuevos registros secundarios (Orders) al conjunto de datos. Para ello, puede usar el evento BindingSource.AddingNew secundario.

Nota

Que tenga que confirmar los nuevos registros primarios o no depende del tipo de control que se use para enlazar al origen de datos.En este tutorial, usa controles individuales para enlazar a la tabla primaria; esto requiere que el código adicional confirme el nuevo registro primario.Si los registros primarios se mostraron en un control de enlace complejo, como DataGridView, esta llamada adicional a EndEdit para el registro primario no sería necesaria.Esto se debe a que la funcionalidad de enlace a datos subyacente del control controla la confirmación de los nuevos registros.

Para agregar código para confirmar los registros primarios en el conjunto de datos antes de agregar registros secundarios

  1. Cree un controlador para el evento OrdersBindingSource.AddingNew.

    • Abra Form1 en la vista de diseño, haga clic en OrdersBindingSource en la bandeja de componentes, seleccione Eventos en la ventana Propiedades y, después, haga doble clic en el evento AddingNew.
  2. Agregue al controlador de evento una línea de código que llame al método CustomersBindingSource.EndEdit. El código del controlador de evento OrdersBindingSource_AddingNew debe tener un aspecto similar al siguiente:

    Me.CustomersBindingSource.EndEdit()
    
    this.customersBindingSource.EndEdit();
    

Comprobar que las actualizaciones jerárquicas están habilitadas

Las actualizaciones jerárquicas se activan y desactivan estableciendo la propiedad Actualización jerárquica del conjunto de datos. Las actualizaciones jerárquicas están habilitadas de forma predeterminada, por lo que, para este tutorial, no tiene que cambiar el valor de la propiedad Actualización jerárquica.

Para comprobar que las actualizaciones jerárquicas están habilitadas

  1. Abra el conjunto de datos en el Diseñador de DataSet haciendo doble clic en el archivo NorthwindDataSet.xsd en el Explorador de soluciones.

  2. Seleccione un área vacía en la superficie del diseñador.

  3. Busque la propiedad Actualización jerárquica en la Propiedades (ventana) y compruebe que esté establecida en True.

    Nota

    La propiedad Actualización jerárquica es la que controla si el código se genera con un TableAdapterManager y con la lógica para realizar actualizaciones jerárquicas.Cuando HierarchicalUpdate se establece en True, se genera un TableAdapterManager; cuando HierarchicalUpdate se establece en False, no se genera un TableAdapterManager.

Probar la aplicación

Para probar la aplicación

  1. Presione F5.

  2. Realice algunos cambios en los datos de uno o más registros de cada tabla.

  3. Agregue un nuevo cliente y, después, agregue un nuevo pedido para ese cliente.

  4. Haga clic en el botón Guardar. El TableAdapterManager controla la lógica necesaria para todas las actualizaciones relacionadas.

  5. Compruebe los valores de la base de datos para verificar que se guardaron los cambios en cada tabla.

Pasos siguientes

En función de los requisitos de la aplicación, hay varios pasos que es posible que desee realizar después de guardar los datos relacionados en la aplicación basada en Windows. Entre las mejoras que podría realizar a esta aplicación se incluyen:

  • Agregar una tercera tabla, como la tabla OrderDetails, y experimentar con una jerarquía de tres tablas.

  • Agregar código de validación para comprobar que los datos cumplen los requisitos de la aplicación, además de las restricciones de base de datos. Para obtener más información, vea Validar datos.

Vea también

Tareas

Cómo: Configurar restricciones FOREIGN KEY en un conjunto de datos

Cómo: Establecer el orden al realizar una actualización jerárquica

Cómo: Confirmar tareas de edición en proceso en controles enlazados a datos antes de guardar los datos

Cómo: Implementar una actualización jerárquica en proyectos de Visual Studio existentes

Tutorial: Guardar datos de tablas de datos relacionadas (actualización jerárquica)

Conceptos

Guardar datos

Otros recursos

Actualización jerárquica

DataSets, DataTables y DataViews