Tutorial: Guardar datos en una transacción

Este tutorial muestra cómo guardar datos en una transacción utilizando el espacio de nombres System.Transactions. En este ejemplo se utilizan las tablas Customers y Orders de la base de datos de ejemplo Northwind.

Requisitos previos

Este tutorial requiere el acceso a la base de datos de ejemplo Northwind. 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.

Crear una aplicación para Windows

El primer paso es crear una Aplicación para Windows.

Para crear el nuevo proyecto de Windows

  1. En Visual Studio, en el menú Archivo cree un nuevo Proyecto.

  2. Dé al proyecto el nombre SavingDataInATransactionWalkthrough.

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

    El proyecto SavingDataInATransactionWalkthrough se crea y se agrega al Explorador de soluciones.

Crear un nuevo origen de datos de base de datos

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

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, seleccione Agregar nuevo origen de datos para iniciar el Asistente para la 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 iniciar el cuadro de diálogo Agregar o modificar conexión y crear una conexión a la base de datos Northwind. 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 Elegir los objetos de base de datos.

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

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

Agregar controles al formulario

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 Windows Forms

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

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

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

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

    Aparecerá un objeto DataGridView en el formulario. En la bandeja de componentes aparece un objeto OrdersTableAdapter y un objeto BindingSource.

Agregar una referencia al ensamblado System.Transactions

Las transacciones utilizan el espacio de nombres System.Transactions. Una referencia de proyecto al ensamblado system.transactions no se agrega de forma predeterminada, por lo que necesita agregarlo manualmente.

Para agregar una referencia al archivo DLL System.Transactions

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

  2. Seleccione System.Transactions (en la ficha .NET) y haga clic en Aceptar.

    En el proyecto se agrega una referencia a System.Transactions.dll.

Modificar el código en el botón SaveItem de BindingNavigator

De forma predeterminada, para la primera tabla colocada en su formulario, se agrega código al evento click del botón guardar en BindingNavigator. Necesita agregar manualmente el código para actualizar cualquier tabla adicional. En este tutorial, se refactoriza el código de guardar existente del controlador del evento click del botón guardar y se crean unos cuantos métodos para proporcionar funcionalidad de actualización específica basándose en si la fila se debe agregar o eliminar.

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

  1. Haga doble clic en el botón Guardar en CustomersBindingNavigator (el botón con el icono del disquete).

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

    Private Sub CustomersBindingNavigatorSaveItem_Click() Handles CustomersBindingNavigatorSaveItem.Click
        UpdateData()
    End Sub
    
    Private Sub UpdateData()
        Me.Validate()
        Me.CustomersBindingSource.EndEdit()
        Me.OrdersBindingSource.EndEdit()
    
        Using updateTransaction As New Transactions.TransactionScope
    
            DeleteOrders()
            DeleteCustomers()
            AddNewCustomers()
            AddNewOrders()
    
            updateTransaction.Complete()
            NorthwindDataSet.AcceptChanges()
        End Using
    End Sub
    
    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 reconciliar los cambios en los datos relacionados es como sigue:

  • Suprimir los registros secundarios (en este caso, elimine los registros de la tabla Orders)

  • Suprimir los registros primarios (en este caso, elimine los registros de la tabla Customers)

  • Insertar los registros primarios (en este caso, inserte registros en la tabla Customers)

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

Para eliminar pedidos existentes

  • Agregue el siguiente método DeleteOrders a Form1:

    Private Sub DeleteOrders()
    
        Dim deletedOrders As NorthwindDataSet.OrdersDataTable
        deletedOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted),
            NorthwindDataSet.OrdersDataTable)
    
        If Not IsNothing(deletedOrders) Then
            Try
                OrdersTableAdapter.Update(deletedOrders)
    
            Catch ex As Exception
                MessageBox.Show("DeleteOrders Failed")
            End Try
        End If
    End Sub
    
    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 Sub DeleteCustomers()
    
        Dim deletedCustomers As NorthwindDataSet.CustomersDataTable
        deletedCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Deleted),
            NorthwindDataSet.CustomersDataTable)
    
        If Not IsNothing(deletedCustomers) Then
            Try
                CustomersTableAdapter.Update(deletedCustomers)
    
            Catch ex As Exception
                MessageBox.Show("DeleteCustomers Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    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 Sub AddNewCustomers()
    
        Dim newCustomers As NorthwindDataSet.CustomersDataTable
        newCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Added),
            NorthwindDataSet.CustomersDataTable)
    
        If Not IsNothing(newCustomers) Then
            Try
                CustomersTableAdapter.Update(newCustomers)
    
            Catch ex As Exception
                MessageBox.Show("AddNewCustomers Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    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 Sub AddNewOrders()
    
        Dim newOrders As NorthwindDataSet.OrdersDataTable
        newOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added),
            NorthwindDataSet.OrdersDataTable)
    
        If Not IsNothing(newOrders) Then
            Try
                OrdersTableAdapter.Update(newOrders)
    
            Catch ex As Exception
                MessageBox.Show("AddNewOrders Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    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");
            }
        }
    }
    

Ejecutar la aplicación

Para ejecutar la aplicación

  • Presione F5 para ejecutar la aplicación.

Vea también

Tareas

Cómo: Guardar datos utilizando una transacción

Conceptos

Transacciones distribuidas de Oracle

Integración de System.Transactions con SQL Server (ADO.NET)

Enlazar controles a los datos en Visual Studio

Otros recursos

Transacciones y simultaneidad (ADO.NET)

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