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

Guardar los datos de una aplicación de vuelta a la base de datos es una tarea bastante sencilla cuando se trabaja con una única tabla de datos, y no es necesario tener en cuenta ninguna restricción FOREIGN KEY. Sin embargo, cuando es necesario guardar los datos de un conjunto de datos que contiene dos o varias tablas de datos relacionadas, los cambios deben enviarse a la base de datos en un orden concreto para que no se infrinjan las restricciones. Al actualizar los datos modificados en tablas relacionadas, puede proporcionar la lógica de programación necesaria para extraer los subconjuntos de datos concretos de cada tabla de datos y enviar las actualizaciones a la base de datos en el orden correcto, o puede usar el componente TableAdapterManager.

En este tutorial, se muestra cómo guardar los datos relacionados mediante el componente TableAdapterManager. Para obtener información sobre la forma de codificar manualmente las actualizaciones de una tabla de datos relacionada, consulte 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 consiste en crear una nueva aplicación basada en Windows.

Para crear una nueva aplicación basada en Windows

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

    Nota

    En los proyectos de Visual Basic y C# se admite la actualización jerárquica, de modo que puede crear 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, consulte Crear aplicaciones basadas en Windows.

    Se creará el proyecto HierarchicalUpdateWalkthrough y se agregará al Explorador de soluciones.

Crear el conjunto de datos

Puesto que necesita que las tablas relacionadas muestren las actualizaciones jerárquicas, el siguiente paso consiste en crear un conjunto de datos con las tablas Customers y Orders de la base de datos Northwind. Cree el conjunto de datos mediante el Asistente para la configuración de orígenes de datos. Deberá 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, consulte 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 la 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 una conexión de datos a la base de datos de ejemplo Northwind está 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. Para obtener más información, consulte Agregar/Modificar conexión (Cuadro de diálogo, General).

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

    NorthwindDataSet se creará y se agregará al proyecto, y las tablas aparecerán en la ventana Orígenes de datos.

Cambiar los controles enlazados a datos predeterminados que deben crearse

Después de rellenar la ventana Orígenes de datos, puede elegir los controles que deben crearse al arrastrar elementos a un formulario 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 deben crearse 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, consulte 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 elementos al formulario.

Para crear controles enlazados a datos para los datos de 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 y una barra de herramientas (BindingNavigator) para navegar por los registros. En la bandeja de componentes, aparece un TableAdapter, un BindingSource y un DataSet con tipo.

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

    Nota

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

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

Modificar el código de guardar generado para realizar una actualización jerárquica

Guarde los cambios de las tablas de datos relacionadas del conjunto de datos en la base 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 del servidor.

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

El código de guardar generado también contiene una línea de código que llama al método CustomersBindingSource.EndEdit. Para ser más exactos, llama al método EndEdit del primer BindingSource agregado al formulario. En otras palabras, este código sólo se genera para la primera tabla que se arrastra desde la ventana Orígenes de datos hasta el formulario. La llamada a EndEdit confirma cualquier cambio en curso en cualquier control enlazado a datos que se esté editando en estos momentos. 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 confirmarán antes de que se guarde realmente (método TableAdapterManager.UpdateAll ).

Nota

El diseñador sólo agrega el código BindingSource.EndEdit al primer elemento colocado en el formulario. Por tanto, es necesario que agregue una línea de código que llame al método BindingSource.EndEdit para cada tabla relacionada del formulario. En el caso de este tutorial, esto significa que debe agregar una llamada al método OrdersBindingSource.EndEdit.

Para actualizar el código a fin de confirmar los cambios de las tablas relacionadas antes de guardarlas

  1. Haga doble clic en el botón Guardar de 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 debería presentar 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 realizados en una tabla secundaria relacionada para poder guardar datos en una base de datos, es posible que también tenga que confirmar los registros primarios recién creados para poder agregar nuevos registros secundarios a un conjunto de datos. Es decir, es posible que tenga que agregar el nuevo registro primario (Customer) al conjunto de datos para que las restricciones FOREIGN KEY permitan agregar nuevos registros secundarios (Orders) al conjunto de datos. Para ello, puede usar el evento BindingSource.AddingNew secundario.

Nota

Puede que tenga que confirmar los nuevos registros primarios, o puede que no; todo dependerá del tipo de control que se use para el enlace al origen de datos. En este tutorial, se usan controles individuales para el enlace a la tabla primaria; esto exige que el código adicional confirme el nuevo registro primario. Si los registros primarios se mostraran en un control de enlace complejo, como DataGridView, no sería necesaria esta llamada adicional a EndEdit para el registro primario. Esto se debe a que la funcionalidad de enlace de datos subyacente del control se encarga de la confirmación de nuevos registros.

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

  1. Cree un controlador de eventos 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, a continuación, haga doble clic en el evento AddingNew.
  2. Agregue al controlador de eventos una línea de código que llame al método CustomersBindingSource.EndEdit. El código del controlador de eventos OrdersBindingSource_AddingNew debe presentar un aspecto similar al siguiente:

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

Comprobar si las actualizaciones jerárquicas están habilitadas

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

Para comprobar si 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 de diseño.

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

    Nota

    El valor de la propiedad Actualización jerárquica controla si el código debe generase con un TableAdapterManager, así como la lógica para realizar o no actualizaciones jerárquicas. Si la propiedad Actualización jerárquica se establece en True, se genera un TableAdapterManager; si la propiedad Actualización jerárquica se establece en False, no se genera ningún 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. TableAdapterManager administra la lógica necesaria para todas las actualizaciones relacionadas.

  5. Compruebe los valores de la base de datos para ver si 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. A continuación, se indican algunas de las mejoras que podría realizar en esta aplicación:

  • 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 si los datos cumplen los requisitos de la aplicación, además de las restricciones de la base de datos. Para obtener más información, consulte 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)

Otros recursos

Actualización jerárquica

Guardar datos

DataSets, DataTables y DataViews (ADO.NET)