複数のTableAdapterオブジェクトのデータ操作を、1つのトランザクションにする方法について説明します。
複数のTableAdapterオブジェクトで同一のデータベースを操作する場合、1つのコネクションを複数のTableAdapterオブジェクトに設定することで、1つのトランザクションにすることができます。
参照
TableAdapterオブジェクトの作成方法は“3.2.2 TableAdapterの作成”を参照してください。
アプリケーションの手順
Visual Studio.NET開発環境のGUIを操作したことでTableAdapterオブジェクトのソースを生成させます
SymfowareConnectionオブジェクトでコネクションを接続します。詳細は、“A.2.1 接続および切断”を参照してください。
TableAdapterオブジェクトを格納するDatasetのオブジェクトを作成します。
複数のTableAdapterオブジェクトを作成します。
1つのSymfowareConnectionオブジェクトを、複数のTableAdapterオブジェクトに設定します。
SymfowareConnection.BeginTransactionメソッドでトランザクションを開始します。
引数IsolationLevelに独立性水準(IsolationLevel.ReadCommitted)を設定します。
SymfowareTransactionオブジェクトが作成されます。
TableAdapterオブジェクトを利用して、データ操作を行います。
データ操作が正常終了した場合、SymfowareTransaction.Commitメソッドを実行します。
データ操作が異常終了した場合、SymfowareTransaction.Rollbackメソッドを実行します。
コネクションを切断します。
エラー処理については、“A.2.8 エラー処理”を参照してください。
// 1.GUIの操作によりTableAdapterオブジェクトのソースを生成(画面操作なので、ソース省略) // SymfowareConnectionオブジェクトの生成 SymfowareConnection con = new SymfowareConnection("DATA SOURCE=127.0.0.1;PORT=26551;" + "INITIAL CATALOG=TEST;USER ID=USER01;PASSWORD=PASS01"); SymfowareTransaction trn = null; // 2. コネクション接続 con.Open(); // 3. DataSetオブジェクトの作成 DataSet1 dataset1 = new DataSet1(); // 4. TableAdapterオブジェクトの作成 DataSet1TableAdapters.TABLE1TableAdapter tbAdapter1 = new DataSet1TableAdapters.TABLE1TableAdapter(); DataSet1TableAdapters.TABLE2TableAdapter tbAdapter2 = new DataSet1TableAdapters.TABLE2TableAdapter(); // 5. コネクションの設定 tbAdapter1.Connection = con; tbAdapter2.Connection = con; // 6. トランザクション開始(独立性水準の設定) trn = con.BeginTransaction(IsolationLevel.ReadCommitted); try { // 7. データ操作を行う処理を記述 tbAdapter1.Update(dataset1.TABLE1); tbAdapter2.Update(dataset1.TABLE2); // 8. コミット trn.Commit(); // 9. コネクション切断 con.Close(); } // エラー処理 catch (Exception e1) { // 8. ロールバック trn.Rollback(); // エラー処理ルーチンを記述 }
注意
複数のTableAdapterオブジェクトのデータ操作を、1つのトランザクションにする場合、TableAdapterオブジェクトのソースを自動生成させるとき、[接続の追加]画面および[接続の変更]画面で、スキーマ名を指定しないようにしてください。スキーマ名を指定した場合は、自動生成されるSQL文にスキーマ名が修飾されません。アプリケーション実行時に設定するSymfowareConnectionオブジェクトに指定されたデフォルトスキーマ名でSQL文が実行されます。そのため、1つのコネクションを複数のTableAdapterオブジェクトに設定する場合、同一スキーマの表に対するTableAdapterオブジェクトだけに設定するようにしてください。