チュートリアル : トランザクションのデータの保存
公開日: 2016年4月
このチュートリアルでは、System.Transactions 名前空間を使用してトランザクションのデータを保存する方法について説明します。 この例では、Northwind サンプル データベースの Customers
テーブルと Orders
テーブルを使用します。
必須コンポーネント
このチュートリアルでは、Northwind サンプル データベースへのアクセスが必要です。 Northwind サンプル データベースのセットアップの詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
Windows アプリケーションの作成
最初に Windows アプリケーションを作成します。
新しい Windows プロジェクトを作成するには
Visual Studio の [ファイル] メニューの [新しいプロジェクト] をクリックします。
プロジェクトに SavingDataInATransactionWalkthrough という名前を付けます。
[Windows アプリケーション] をクリックし、[OK] をクリックします。 詳細については、「クライアント アプリケーション」を参照してください。
SavingDataInATransactionWalkthrough プロジェクトが作成されてソリューション エクスプローラーに追加されます。
データベースのデータ ソースの作成
この手順では、データ ソース構成ウィザードを使用して、Northwind サンプル データベースの Customers
テーブルと Orders
テーブルに基づいてデータ ソースを作成します。
データ ソースを作成するには
[データ] メニューの [データ ソースの表示] をクリックします。
[データ ソース] ウィンドウで、[新しいデータ ソースの追加] をクリックしてデータ ソース構成ウィザードを起動します。
[データソースの種類を選択] ページで、[データベース] をクリックし、[次へ] をクリックします。
[データ接続の選択] ページで、次のいずれかの操作を行います。
Northwind サンプル データベースへのデータ接続がドロップダウン リストに表示されている場合は選択します。
または
[新しい接続] を選択して [接続の追加] または [接続の変更] ダイアログ ボックスを表示し、Northwind データベースへの接続を作成します。
データベースにパスワードが必要な場合は、該当するオプションを選択して重要情報を含め、[次へ] をクリックします。
[アプリケーション構成ファイルに接続文字列を保存] ページで、[次へ] をクリックします。
[データベース オブジェクトの選択] ページの [テーブル] ノードを展開します。
Customers
テーブルとOrders
テーブルを選択し、[完了] をクリックします。プロジェクトに NorthwindDataSet が追加され、[データ ソース] ウィンドウに
Customers
テーブルとOrders
テーブルが表示されます。
フォームへのコントロールの追加
[データ ソース] ウィンドウからフォームに項目をドラッグして、データ バインド コントロールを作成します。
Windows フォームにデータ バインド コントロールを作成するには
[データ ソース] ウィンドウの [Customers] ノードを展開します。
[データ ソース] ウィンドウから Form1 にメインの [Customers] ノードをドラッグします。
レコード間をナビゲートするための DataGridView コントロールとツール ストリップ (BindingNavigator) がフォームに表示されます。 NorthwindDataSet、CustomersTableAdapter、BindingSource、および BindingNavigator がコンポーネント トレイに表示されます。
対応する [Orders] ノード (メインの [Orders] ノードではなく、[Fax] 列の下の対応する子テーブル ノード) を CustomersDataGridView の下のフォームにドラッグします。
DataGridView がフォームに表示されます。 コンポーネント トレイに OrdersTableAdapter と BindingSource が表示されます。
System.Transactions アセンブリへの参照の追加
トランザクションは、System.Transactions 名前空間を使用します。 System.Transactions アセンブリへのプロジェクト参照は既定で追加されないため、手動で追加する必要があります。
System.Transactions の DLL ファイルへの参照を追加するには
[プロジェクト] メニューから [参照の追加] を選択します。
[.NET] タブの System.Transactions を選択し、[OK] をクリックします。
System.Transactions への参照がプロジェクトに追加されます。
BindingNavigator の SaveItem ボタンのコードの変更
既定では、フォームに最初にドロップされるテーブルのコードは、BindingNavigator の保存ボタンの click
イベントに追加されます。 追加テーブルを更新する場合は、手動でコードを追加する必要があります。 このチュートリアルでは、保存ボタンの click イベント ハンドラーから既存の保存コードをリファクタリングし、行を追加するか削除するかに応じて、指定された更新機能を提供するメソッドを作成します。
自動生成された保存コードを変更するには
CustomersBindingNavigator の [保存] (フロッピー ディスクのアイコンのボタン) をダブルクリックします。
CustomersBindingNavigatorSaveItem_Click
メソッドを次のコードで置き換えます。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
関連するデータへの変更を解決する順序は次のとおりです。
子レコードを削除します (この場合は、
Orders
テーブルからレコードを削除します)。親レコードを削除します (この場合は、
Customers
テーブルからレコードを削除します)。親レコードを挿入します (この場合は、
Customers
テーブルにレコードを挿入します)。子レコードを挿入します (この場合は、
Orders
テーブルにレコードを挿入します)。
既存の注文を削除するには
次の
DeleteOrders
メソッドを 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
既存の顧客を削除するには
次の
DeleteCustomers
メソッドを 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
新規顧客を追加するには
次の
AddNewCustomers
メソッドを 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
新規注文を追加するには
次の
AddNewOrders
メソッドを 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
アプリケーションの実行
アプリケーションを実行するには
- F5 キーを押してアプリケーションを実行します。
参照
トランザクションと同時実行
Oracle 分散トランザクション
方法 : トランザクションを使用してデータを保存する
SQL Server と System.Transactions の統合
Visual Studio でのデータへの接続
アプリケーションでデータを受け取る準備
アプリケーションへのデータのフェッチ
Visual Studio でのデータへのコントロールのバインド
アプリケーションでのデータ編集
データの検証
データの保存