Tutorial: Guardar datos en una base de datos (Varias tablas)

Uno de los escenarios más comunes en el desarrollo de aplicaciones consiste en mostrar los datos en un formulario de una aplicación Windows, editar los datos y devolverlos actualizados a la base de datos. Este tutorial crea un formulario en el que aparecen datos de dos tablas relacionadas y muestra cómo editar los registros y volver a guardar los cambios en la base de datos. En este ejemplo se utilizan las tablas Customers y Orders de la base de datos de ejemplo Northwind.

Puede guardar los datos de la aplicación en la base de datos llamando al método Update de un TableAdapter. Cuando se arrastran elementos desde la ventana Orígenes de datos, el código para guardar los datos se agrega automáticamente para la primera tabla colocada en un formulario. Cualquier tabla adicional agregada a un formulario requiere la adición manual de código necesario para guardar los datos. Este tutorial muestra cómo agregar código para guardar las actualizaciones de varias tablas.

Nota

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Trabajar con valores de configuración.

Las tareas ilustradas en este tutorial incluyen:

Requisitos previos

Para poder completar este tutorial, necesitará:

Crear la aplicación para Windows

El primer paso es crear una Aplicación para Windows. La asignación de un nombre al proyecto es opcional en este paso, pero se le asignará un nombre para guardarlo más adelante.

Para crear el nuevo proyecto de aplicación para Windows

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

  2. Asigne al proyecto el nombre UpdateMultipleTablesWalkthrough.

  3. Seleccione Aplicación para Windows y haga clic en Aceptar. Para obtener más información, vea Crear aplicaciones basadas en Windows.

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

Crear el origen de datos

Este paso crea un origen de datos a partir de la base de datos Northwind utilizando el Asistente para la 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 configuración de la base de datos de ejemplo Northwind, vea Cómo: Instalar bases de datos de ejemplo.

Para crear el origen 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. Seleccione Base de datos en la página Elegir un tipo de datos de origen y luego haga clic en Siguiente.

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

    • Si una conexión de datos a la base de datos de ejemplo Northwind está disponible en la lista desplegable, selecciónela.

      O bien

    • Seleccione Nueva conexión para abrir el cuadro de diálogo Agregar o modificar conexión. Para obtener más información, vea Agregar/Modificar conexión (Cuadro de diálogo, General).

  5. Si su base de datos requiere una contraseña, seleccione la opción para incluir datos confidenciales y 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. Seleccione las tablas Customers y Orders y, a continuación, haga clic en Finalizar.

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

Establecer los controles que se deben crear

Para este tutorial, los datos de la tabla Customers estarán en un diseño Detalles en el que los datos se muestran en controles individuales. Los datos de la tabla Orders estarán en un diseño Cuadrícula mostrado en un control DataGridView.

Para establecer el tipo Drop para los elementos en la ventana Orígenes de datos

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

  2. Cambie el control de la tabla Customers a controles individuales seleccionando 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.

Crear el formulario enlazado a datos

Puede crear los controles enlazados a datos arrastrando elementos desde la ventana Orígenes de datos al formulario.

Para crear controles enlazados en el formulario

  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 una barra de herramientas (BindingNavigator) para navegar por los registros. Aparecen en la bandeja de componentes NorthwindDataSet, CustomersTableAdapter, BindingSource y BindingNavigator.

  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 y es un nodo secundario del nodo Customers.

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

Agregar código para actualizar la base de datos

Puede actualizar la base de datos llamando a los métodos Update de los TableAdapters Customers y Orders. De manera predeterminada, se agrega un controlador de eventos para el botón Guardar de BindingNavigator al código del formulario para enviar las actualizaciones a la base de datos. Este procedimiento modifica ese código de modo que envíe las actualizaciones en el orden apropiado y se elimine así la posibilidad de que se produzcan errores de integridad referencial. El código también implementa el control de errores colocando la llamada de actualización en un bloque try-catch. Puede modificar el código para que se ajuste a las necesidades de su aplicación.

Nota

Para mayor claridad, este tutorial no utiliza una transacción, pero si va a actualizar dos o más tablas relacionadas, debería incluir toda la lógica de actualización dentro de una transacción. Una transacción es un proceso que asegura que todos los cambios relacionados con una base de datos son correctos antes de confirmar cualquier cambio. Para obtener más información, vea Transacciones y simultaneidad (ADO.NET).

Para agregar lógica de actualización a la aplicación

  1. Haga doble clic en el botón Guardar de BindingNavigator para abrir el controlador del evento bindingNavigatorSaveItem_Click en el Editor de código.

  2. Reemplace el código del controlador de eventos para que llame a los métodos Update de los TableAdapters relacionados. El código siguiente crea en primer lugar tres tablas de datos temporales para la información actualizada de cada DataRowState (Deleted, Added y Modified). A continuación se ejecutan las actualizaciones en el orden apropiado. El código debe tener este aspecto:

    Me.Validate()
    Me.OrdersBindingSource.EndEdit()
    Me.CustomersBindingSource.EndEdit()
    
    Dim deletedOrders As NorthwindDataSet.OrdersDataTable = CType(
        NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable)
    
    Dim newOrders As NorthwindDataSet.OrdersDataTable = CType(
        NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable)
    
    Dim modifiedOrders As NorthwindDataSet.OrdersDataTable = CType(
        NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable)
    
    
    Try
        ' Remove all deleted orders from the Orders table.
        If Not deletedOrders Is Nothing Then
            OrdersTableAdapter.Update(deletedOrders)
        End If
    
        ' Update the Customers table.
        CustomersTableAdapter.Update(NorthwindDataSet.Customers)
    
        ' Add new orders to the Orders table.
        If Not newOrders Is Nothing Then
            OrdersTableAdapter.Update(newOrders)
        End If
    
        ' Update all modified Orders.
        If Not modifiedOrders Is Nothing Then
            OrdersTableAdapter.Update(modifiedOrders)
        End If
    
        NorthwindDataSet.AcceptChanges()
    
    Catch ex As Exception
        MsgBox("Update failed")
    
    Finally
        If Not deletedOrders Is Nothing Then
            deletedOrders.Dispose()
        End If
    
        If Not newOrders Is Nothing Then
            newOrders.Dispose()
        End If
    
        If Not modifiedOrders Is Nothing Then
            modifiedOrders.Dispose()
        End If
    End Try
    
    this.Validate();
    this.ordersBindingSource.EndEdit();
    this.customersBindingSource.EndEdit();
    
    NorthwindDataSet.OrdersDataTable deletedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
    NorthwindDataSet.OrdersDataTable newOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
    NorthwindDataSet.OrdersDataTable modifiedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
    try
    {
        // Remove all deleted orders from the Orders table.
        if (deletedOrders != null)
        {
            ordersTableAdapter.Update(deletedOrders);
        }
    
        // Update the Customers table.
        customersTableAdapter.Update(northwindDataSet.Customers);
    
        // Add new orders to the Orders table.
        if (newOrders != null)
        {
            ordersTableAdapter.Update(newOrders);
        }
    
        // Update all modified Orders.
        if (modifiedOrders != null)
        {
            ordersTableAdapter.Update(modifiedOrders);
        }
    
        northwindDataSet.AcceptChanges();
    }
    
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    
    finally
    {
        if (deletedOrders != null)
        {
            deletedOrders.Dispose();
        }
        if (newOrders != null)
        {
            newOrders.Dispose();
        }
        if (modifiedOrders != null)
        {
            modifiedOrders.Dispose();
        }
    }
    

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. Presione el botón Guardar.

  4. Compruebe los valores de la base de datos para verificar que se guardaron los cambios.

    Nota

    Para obtener un código de ejemplo que muestra cómo actualizar la lista de pedidos al cambiar los clientes o agregar nuevos datos de cliente y pedidos, vea Cómo: Insertar nuevos registros en una base de datos y Tutorial: Guardar datos de tablas de datos relacionadas (actualización jerárquica).

Pasos siguientes

Dependiendo de los requisitos de la aplicación, hay varios pasos que puede que desee realizar después de crear un formulario enlazado a datos en su aplicación para Windows. Entre las mejoras que podría realizar en las tareas de este tutorial se incluyen:

Vea también

Conceptos

Novedades en el desarrollo de aplicaciones de datos

Enlazar controles de Windows Forms a datos en Visual Studio

Enlazar controles a los datos en Visual Studio

Otros recursos

Tutoriales sobre datos

Información general de las aplicaciones de datos en Visual Studio

Conectarse a datos en Visual Studio

Preparar la aplicación para recibir datos

Buscar datos en la aplicación

Modificar datos en la aplicación

Validar datos

Guardar datos

Historial de cambios

Fecha

Historial

Motivo

Mayo de 2011

Se han agregado vínculos al código de ejemplo adicional.

Comentarios de los clientes.