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
In Visual Studio, from the File menu, create a new Project.
Name the project SavingDataInATransactionWalkthrough.
Select Windows Application and click OK. For more information, see Creating Windows-Based Applications.
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
On the Data menu, click Show Data Sources.
In the Data Sources window, select Add New Data Source to start the Data Source Configuration Wizard.
Select Database on the Choose a Data Source Type page, and then click Next.
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. For more information, see Add/Modify Connection Dialog Box (General).
If your database requires a password, select the option to include sensitive data, and then click Next.
Click Next on the Save connection string to the Application Configuration file page.
Expand the Tables node on the Choose your Database Objects page.
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
Expand the Customers node in the Data Sources window.
Drag the main Customers node from the Data Sources window onto Form1.
A DataGridView control and a tool strip (BindingNavigator) for navigating records appear on the form. A NorthwindDataSet, CustomersTableAdapter, BindingSource, and BindingNavigator appear in the component tray.
Drag the related Orders node (the related child-table node below the Fax column, not the main Orders node) onto the form below the CustomersDataGridView.
A DataGridView appears on the form. An OrdersTableAdapter and BindingSource appear in the component tray.
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
From the Project menu, choose Add Reference.
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
Double-click the Save button on the CustomersBindingNavigator (the button with the floppy disk icon).
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
Oracle Distributed Transactions
System.Transactions Integration with SQL Server (ADO.NET)
Preparing Your Application to Receive Data
Fetching Data into Your Application
Binding Controls to Data in Visual Studio
Editing Data in Your Application