チュートリアル : トランザクションのデータの保存
更新 : 2007 年 11 月
このチュートリアルでは、System.Transactions 名前空間を使用してトランザクションのデータを保存する方法を示します。この例では、Northwind サンプル データベースの Customers テーブルと Orders テーブルを使用します。
前提条件
このチュートリアルには、Northwind サンプル データベースへのアクセスが必要です。Northwind サンプル データベースのセットアップの詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
Windows アプリケーションの作成
最初に Windows アプリケーションを作成します。
新しい Windows プロジェクトを作成するには
Visual Studio の [ファイル] メニューの [新しいプロジェクト] をクリックします。
プロジェクトに SavingDataInATransactionWalkthrough という名前を付けます。
[Windows アプリケーション] をクリックし、[OK] をクリックします。詳細については、「Windows ベースのアプリケーションの作成」を参照してください。
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 イベントに追加されます。追加テーブルを更新する場合は、手動でコードを追加する必要があります。このチュートリアルでは、保存ボタンのイベント ハンドラから既存の保存コードをリファクタリングし、行を追加するかまたは削除するかによって、必要な更新機能を提供するメソッドを作成します。
自動生成された保存コードを変更するには
CustomersBindingNavigator の [保存] ボタン (フロッピー ディスクのアイコンのボタン) をダブルクリックします。
CustomersBindingNavigatorSaveItem_Click メソッドを次のコードで置き換えます。
Private Sub CustomersBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 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(); } }
関連するデータへの変更を解決する順序は次のとおりです。
子レコードを削除します。この場合は、Orders テーブルからレコードを削除します。
親レコードを削除します。この場合は、Customers テーブルからレコードを削除します。
親レコードを挿入します。この場合は、Customers テーブルにレコードを挿入します。
親レコードを挿入します。この場合は、Orders テーブルにレコードを挿入します。
既存の注文を削除するには
Form1 に次の DeleteOrders メソッドを追加します。
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"); } } }
既存の顧客を削除するには
Form1 に次の DeleteCustomers メソッドを追加します。
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"); } } }
新規顧客を追加するには
Form1 に次の AddNewCustomers メソッドを追加します。
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"); } } }
新規注文を追加するには
Form1 に次の AddNewOrders メソッドを追加します。
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"); } } }
アプリケーションの実行
アプリケーションを実行するには
- F5 キーを押してアプリケーションを実行します。
参照
処理手順
概念
SQL Server と System.Transactions の統合 (ADO.NET)