Walkthrough: Saving Data in a Transaction

This walkthrough demonstrates how to save data in a transaction using the System.Transactions namespace. This example uses the Customers and Orders tables from the Northwind sample database.

Prerequisites

This walkthrough requires access to the Northwind sample database. For information on setting up the Northwind sample database, see How to: Install Sample Databases.

Creating a Windows Application

The first step is to create a Windows Application.

To create the new Windows project

  1. In Visual Studio, from the File menu, create a new Project.

  2. Name the project SavingDataInATransactionWalkthrough.

  3. Select Windows Application and click OK. For more information, see Developing Client Applications with the .NET Framework.

    The SavingDataInATransactionWalkthrough project is created and added to Solution Explorer.

Creating a Database Data Source

This step uses the Data Source Configuration Wizard to create a data source based on the Customers and Orders tables in the Northwind sample database.

To create the data source

  1. On the Data menu, click Show Data Sources.

  2. In the Data Sources window, select Add New Data Source to start the Data Source Configuration Wizard.

  3. Select Database on the Choose a Data Source Type page, and then click Next.

  4. On the Choose your Data Connection page do one of the following:

    • If a data connection to the Northwind sample database is available in the drop-down list, select it.

      -or-

    • Select New Connection to launch the Add/Modify Connection dialog box and create a connection to the Northwind database.

  5. If your database requires a password, select the option to include sensitive data, and then click Next.

  6. Click Next on the Save connection string to the Application Configuration file page.

  7. Expand the Tables node on the Choose your Database Objects page.

  8. Select the Customers and Orders tables, and then click Finish.

    The NorthwindDataSet is added to your project and the Customers and Orders tables appear in the Data Sources window.

Adding Controls to the Form

You can create the data-bound controls by dragging items from the Data Sources window onto your form.

To create data bound controls on the Windows Form

Adding a Reference to the System.Transactions Assembly

Transactions use the System.Transactions namespace. A project reference to the system.transactions assembly is not added by default, so you need to manually add it.

To add a reference to the System.Transactions DLL file

  1. From the Project menu, choose Add Reference.

  2. Select System.Transactions (on the .NET tab) and click OK.

    A reference to System.Transactions is added to the project.

Modifying the Code in the BindingNavigator's SaveItem Button

By default, for the first table dropped onto your form, code is added to the click event of the save button on the BindingNavigator. You need to manually add code to update any additional tables. For this walkthrough, we refactor the existing save code out of the save button's click event handler and create a few more methods to provide specific update functionality based on whether the row needs to be added or deleted.

To modify the auto-generated save code

  1. Double-click the Save button on the CustomersBindingNavigator (the button with the floppy disk icon).

  2. Replace the CustomersBindingNavigatorSaveItem_Click method with the following code:

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

The order for reconciling changes to related data is as follows:

  • Delete child records (in this case, delete records from the Orders table)

  • Delete parent records (in this case, delete records from the Customers table)

  • Insert parent records (in this case, insert records in the Customers table)

  • Insert child records (in this case, insert records in the Orders table)

To delete existing orders

  • Add the following DeleteOrders method to 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");
            }
        }
    }
    

To delete existing customers

  • Add the following DeleteCustomers method to 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");
            }
        }
    }
    

To add new customers

  • Add the following AddNewCustomers method to 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");
            }
        }
    }
    

To add new orders

  • Add the following AddNewOrders method to 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");
            }
        }
    }
    

Running the Application

To run the application

  • Press F5 to run the application.

See Also

Tasks

How to: Save Data by Using a Transaction

Concepts

Preparing Your Application to Receive Data

Fetching Data into Your Application

Binding Controls to Data in Visual Studio

Editing Data in Your Application

Validating Data

Saving Data

Other Resources

Performing Transactions

Enlisting in Distributed Transactions

Leveraging System.Transactions

Connecting to Data in Visual Studio