Tutorial: Guardar los datos de transacciones 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.

En este tutorial se muestra cómo guardar datos en una transacción mediante el espacio de nombres System.Transactions. En este tutorial, creará una aplicación de Windows Forms. Usará el Asistente de configuración de origen de datos para crear un conjunto de datos para dos tablas en la base de datos de ejemplo de Northwind. Agregará controles enlazados a datos a un formulario de Windows y modificará el código del botón Guardar de BindingNavigator para actualizar la base de datos dentro de un transactionScope.

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, SQL Server Express LocalDB puede instalarse como parte de la carga de trabajo de desarrollo de escritorio de .NET o 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.

Crear una aplicación de Windows Forms

El primer paso es crear una aplicación de Windows Forms (.NET Framework).

  1. En Visual Studio, en el menú Archivo, seleccione Nuevo>Proyecto.

  2. Expanda Visual C# o Visual Basic en el panel de la izquierda y, a continuación, seleccione Escritorio de Windows.

  3. En el panel central, seleccione el tipo de proyecto Aplicación de Windows Forms.

  4. Nombre el proyecto SavingDataInATransactionWalkthrough, y luego seleccione Aceptar.

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

Crear un origen de datos de base de datos

En este paso se usa el Asistente para configuración de orígenes de datos para crear un origen de datos basado en las tablas Customers y Orders de la base de datos de ejemplo de Northwind.

  1. Para abrir la ventana Orígenes de datos, seleccione Mostrar orígenes de datos en el menú 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 iniciar el cuadro de diálogo Agregar o modificar conexión y cree una conexión con la base de datos Northwind.

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

  6. En la pantalla 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 Customers y Orders y después seleccione Finalizar.

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

Adición de controles al formulario

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

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

  2. Arrastre el nodo principal Customers desde la ventana Orígenes de datos hasta Form1.

    En el formulario aparecen un control DataGridView y una barra de herramientas (BindingNavigator) para navegar por los registros. Un NorthwindDataSet, CustomersTableAdapter, BindingSource y BindingNavigator aparecen en la bandeja de componentes.

  3. Arrastre el nodo Pedidos (no el nodo principal Pedidos, sino el nodo relacionado de la tabla secundaria debajo de la columna Fax) al formulario debajo de CustomersDataGridView.

    En el formulario aparece una DataGridView. Aparecen una OrdersTableAdapter y una BindingSource en la bandeja de componentes.

Agregar una referencia al ensamblado System.Transactions

Las transacciones usan el espacio de nombres System.Transactions. De forma predeterminada, no se agrega una referencia de proyecto al ensamblado system.transactions, por lo que tiene que agregarla manualmente.

Para agregar una referencia al archivo DLL System.Transactions

  1. En el menú Proyecto, seleccione Agregar referencia.

  2. Seleccione System.Transactions (en la pestaña .NET) y, después, seleccione Aceptar.

    Se agrega una referencia a System.Transactions al proyecto.

Modifique el código del botón SaveItem de BindingNavigator

Para la primera tabla que se coloca en el formulario, el código se añade por defecto al evento click del botón de guardar en el BindingNavigator. Para actualizar otras tablas, debe agregar el código manualmente. Para este tutorial, refactorizamos el código de guardado existente fuera del controlador de eventos del botón de guardado. También creamos algunos métodos más para proporcionar una funcionalidad de actualización específica basada en si es necesario agregar o eliminar la fila.

Para modificar el código de guardado generado automáticamente

  1. Seleccione el botón Guardar en el CustomersBindingNavigator (el botón con el icono del disquete).

  2. Reemplace el método CustomersBindingNavigatorSaveItem_Click con el código siguiente:

    private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        UpdateData();
    }
    
    private void UpdateData()
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.ordersBindingSource.EndEdit();
    
        using (System.Transactions.TransactionScope updateTransaction = 
            new System.Transactions.TransactionScope())
        {
            DeleteOrders();
            DeleteCustomers();
            AddNewCustomers();
            AddNewOrders();
    
            updateTransaction.Complete();
            northwindDataSet.AcceptChanges();
        }
    }
    

El orden para conciliar los cambios a los datos relacionados es el siguiente:

  • Eliminar registros secundarios. (En este caso, elimine los registros de la tabla Orders).

  • Elimine los registros primarios. (En este caso, elimine los registros de la tabla Customers).

  • Inserte registros primarios. (En este caso, inserte registros en la tabla Customers).

  • Insertar registros secundarios. (En este caso, inserte registros en la tabla Orders).

Para eliminar pedidos existentes

  • Agregue el siguiente método DeleteOrders a Form1:

    private void DeleteOrders()
    {
        NorthwindDataSet.OrdersDataTable deletedOrders;
        deletedOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        if (deletedOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(deletedOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteOrders Failed");
            }
        }
    }
    

Para eliminar clientes existentes

  • Agregue el siguiente método DeleteCustomers a Form1:

    private void DeleteCustomers()
    {
        NorthwindDataSet.CustomersDataTable deletedCustomers;
        deletedCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Deleted);
    
        if (deletedCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(deletedCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteCustomers Failed");
            }
        }
    }
    

Para agregar nuevos clientes

  • Agregue el siguiente método AddNewCustomers a Form1:

    private void AddNewCustomers()
    {
        NorthwindDataSet.CustomersDataTable newCustomers;
        newCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Added);
    
        if (newCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(newCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewCustomers Failed");
            }
        }
    }
    

Para agregar nuevos pedidos

  • Agregue el siguiente método AddNewOrders a Form1:

    private void AddNewOrders()
    {
        NorthwindDataSet.OrdersDataTable newOrders;
        newOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        if (newOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(newOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewOrders Failed");
            }
        }
    }
    

Ejecución de la aplicación

Presione F5 para ejecutar la aplicación.