Guardar datos en una base de datos (varias tablas) en aplicaciones de .NET Framework

Nota:

Los conjuntos de datos y las clases relacionadas son tecnologías heredadas de .NET Framework de principios de la década de 2000 que permiten a las aplicaciones trabajar con datos en memoria mientras están desconectadas de la base de datos. Las tecnologías son especialmente útiles para las aplicaciones que permiten a los usuarios modificar los datos y conservar los cambios en la base de datos. Aunque los conjuntos de datos han demostrado ser una tecnología de gran éxito, se recomienda que las nuevas aplicaciones de .NET usen Entity Framework Core. Entity Framework proporciona una manera más natural de trabajar con datos tabulares como modelos de objetos y tiene una interfaz de programación más sencilla.

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 su aplicación en la base de datos llamando al método Update de un TableAdapter. Al arrastrar tablas desde la ventana Orígenes de datos a un formulario, se agrega automáticamente el código necesario para guardar los datos. Las tablas adicionales que se agregan a un formulario requieren la adición manual de este código. Este tutorial muestra cómo agregar código para guardar las actualizaciones de varias tablas.

Las tareas ilustradas en este tutorial incluyen:

Requisitos previos

Para completar este tutorial, necesita que las cargas de trabajo de desarrollo de escritorio de .NET y de almacenamiento y procesamiento de datos estén instaladas en Visual Studio. Para instalarlas, abra el Instalador de Visual Studio y elija Modificar (o Más>modificar) junto a la versión de Visual Studio que desea modificar. Vea Modificación de Visual Studio.

En este tutorial se usa LocalDB de SQL Server Express y la base de datos de ejemplo Northwind.

  1. Si no tiene LocalDB de SQL Server Express, instálelo desde la página de descarga de SQL Server Express, o bien mediante el Instalador de Visual Studio. En el Instalador de Visual Studio, puede instalar LocalDB de SQL Server Express como parte de la carga de trabajo Almacenamiento y procesamiento de datos, o bien como un componente individual.

  2. Siga estos pasos para instalar la base de datos de ejemplo Northwind:

    1. En Visual Studio, abra la ventana Explorador de objetos de SQL Server (Explorador de objetos de SQL Server se instala como parte de la carga de trabajo Almacenamiento y procesamiento de datos en el Instalador de Visual Studio). Expanda el nodo SQL Server. Haga clic con el botón derecho en la instancia de LocalDB y seleccione Nueva consulta.

      Se abre una ventana del editor de consultas.

    2. Copie el script de Transact-SQL Northwind en el Portapapeles. Este script de T-SQL crea la base de datos Northwind desde cero y la rellena con datos.

    3. Pegue el script de T-SQL en el editor de consultas y, después, elija el botón Ejecutar.

      Después de un breve tiempo, la consulta termina de ejecutarse y se crea la base de datos Northwind.

Creación de la aplicación de Windows Forms

Cree un nuevo proyecto de Aplicación de Windows Forms para C# o Visual Basic. Asigne al proyecto el nombre UpdateMultipleTablesWalkthrough.

Creación del 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 información sobre cómo configurar la base de datos de ejemplo Northwind, consulte Instalación de las bases de datos de ejemplo.

  1. En el menú Datos, seleccione Mostrar orígenes de datos.

    Se abre la ventana Orígenes de datos.

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

  3. En la pantalla Elegir un tipo de origen de datos, seleccione base de datos y, a continuación, Siguiente.

  4. En la pantalla 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.

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

  6. En Guardar la cadena de conexión en el archivo de configuración de la aplicación, seleccione Siguiente.

  7. Expanda el nodo Tablas en la pantalla Elija los objetos de base de datos.

  8. Seleccione las tablas Clientes y Pedidos y, después, seleccione Finalizar.

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

Establecimiento de los controles que se van a crear

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

Para establecer el tipo de acción de colocación de los elementos de la ventana Orígenes de datos

  1. En la ventana Orígenes de datos, expanda el nodo Clientes.

  2. En el nodo Clientes, seleccione Detalles en la lista de controles para cambiar el control de la tabla Clientes por controles individuales. Para más información, vea Establecimiento del control que se creará al arrastrar desde la ventana Orígenes de datos.

Creación del formulario enlazado a datos

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

  1. Arrastre el nodo principal Customers desde la ventana Orígenes de datos hasta 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. Un NorthwindDataSet, CustomersTableAdapter, BindingSource y BindingNavigator aparecen en la bandeja de componentes.

  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. Aparecen una OrdersTableAdapter y una BindingSource en la bandeja de componentes.

Adición de 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 actualizaciones a la base de datos. Este procedimiento modifica el código para enviar actualizaciones en el orden apropiado y se elimina 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 satisfacer las necesidades de la aplicación.

Nota

Para mayor claridad, en este tutorial no se usan transacciones. Sin embargo, si va a actualizar dos o más tablas relacionadas, incluya 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 confirmarlos. Para más información, consulte Transacciones y simultaneidad.

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

  1. Seleccione el botón Guardar en BindingNavigator. Se abre el Editor de código en el controlador de eventos bindingNavigatorSaveItem_Click.

  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). Las actualizaciones se ejecutan en el orden correcto. El código debe tener este aspecto:

    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();
        }
    }
    

Prueba de la aplicación

  1. Presione F5.

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

  3. Seleccione el botón Guardar.

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