Save data in a transaction
Note
This article applies to Visual Studio 2015. If you're looking for the latest Visual Studio documentation, see Visual Studio documentation. We recommend upgrading to the latest version of Visual Studio. Download it here
This walkthrough demonstrates how to save data in a transaction by 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.
Create a Windows application
The first step is to create a Windows Application.
To create the new Windows project
In Visual Studio, on the File menu, create a new Project.
Name the project SavingDataInATransactionWalkthrough.
Select Windows Application, and then select OK. For more information, see Client Applications.
The SavingDataInATransactionWalkthrough project is created and added to Solution Explorer.
Create 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, selectShow Data Sources.
In the Data Sources window, select Add New Data Source to start the Data Source Configuration Wizard.
On the Choose a Data Source Typescreen, select Database, and then select Next.
On the Choose your Data Connectionscreen 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.
If your database requires a password, select the option to include sensitive data, and then select Next.
On the Save connection string to the Application Configuration file screen, select Next.
On the Choose your Database Objects screen, expand the Tables node.
Select the
Customers
andOrders
tables, and then select Finish.The NorthwindDataSet is added to your project and the
Customers
andOrders
tables appear in the Data Sources window.
Addcontrols 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
In the Data Sources window, expand the Customers node.
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 (not the main Orders node, but the related child-table node below the Fax column) onto the form below the CustomersDataGridView.
A DataGridView appears on the form. An OrdersTableAdapter and BindingSource appear in the component tray.
Add 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
On the Project menu, selectAdd Reference.
Select System.Transactions(on the .NET tab), and then select OK.
A reference to System.Transactions is added to the project.
Modifythe code in the BindingNavigator's SaveItem button
For the first table dropped onto your form, code is added by default 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.We also 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
Select the Save button on the CustomersBindingNavigator (the button with the floppy disk icon).
Replace the
CustomersBindingNavigatorSaveItem_Click
method with the following code: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
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 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
To delete existing customers
Add the following
DeleteCustomers
method to 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
To add new customers
Add the following
AddNewCustomers
method to 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
To add new orders
Add the following
AddNewOrders
method to 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
Run the application
To run the application
- Select F5 to run the application.