Compartir a través de


Tutorial: Guardar datos en una transacción

 

En este tutorial se muestra cómo guardar datos en una transacción usando 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 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. Asigne al proyecto el nombre SavingDataInATransactionWalkthrough.

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

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

    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 a datos en el formulario de 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 situado debajo de la columna Fax, no el nodo Orders principal) en el formulario debajo de CustomersDataGridView.

    En el formulario aparece una DataGridView. En la bandeja de componentes aparece un objeto OrdersTableAdapter y un objeto BindingSource.

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, elija Agregar referencia.

  2. Seleccione System.Transactions (en la pestaña .NET) y haga clic en Aceptar.

    Se agrega una referencia a System.Transactions al proyecto.

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

De forma predeterminada, para la primera tabla que se coloca en el formulario, se agrega código al evento click del botón de guardado en BindingNavigator. Para actualizar otras tablas, debe agregar el código manualmente. Para este tutorial, refactorizamos el código de guardado existente a partir del controlador del evento de clic del botón de guardado, y creamos algunos métodos más para proporcionar funcionalidad de actualización específica según si la fila se debe agregar o eliminar.

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

  1. Haga doble clic en el botón Guardar en CustomersBindingNavigator (el botón con el icono de 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();
                }
            }
    
        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
    

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

  • Eliminar los registros secundarios (en este caso, eliminar los registros de la tabla Orders)

  • Eliminar los registros primarios (en este caso, eliminar los registros de la tabla Customers)

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

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

Para eliminar pedidos existentes

  • Agregue el método siguiente 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");
                    }
                }
            }
    
        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
    

Para eliminar clientes existentes

  • Agregue el método siguiente 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");
                    }
                }
            }
    
        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
    

Para agregar nuevos clientes

  • Agregue el método siguiente 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");
                    }
                }
            }
    
        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
    

Para agregar nuevos pedidos

  • Agregue el método siguiente 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");
                    }
                }
            }
    
        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
    

Ejecutar la aplicación

Para ejecutar la aplicación

  • Presione F5 para ejecutar la aplicación.

Vea también

Transacciones y simultaneidad
Transacciones distribuidas de Oracle
Cómo: Guardar datos utilizando una transacción
Integración de System.Transactions con SQL Server
Conectarse a datos en Visual Studio
Preparar la aplicación para recibir datos
Buscar datos en la aplicación
Enlazar controles a los datos en Visual Studio
Modificar datos en la aplicación
Validar datos
Guardar datos