TransactionScopeクラス [VB.NET]

Visual Basic.NET ADO.NETデータベースプログラミング

VB 2005( .NET Framework 2.0)以降

VB 2005( .NET Framework 2.0)から、TransactionScopeクラスを利用して、トランザクション処理ができます。

TransactionScopeクラスを利用すると、トランザクションで例外が発生した場合に、ロールバックメソッドを呼び出す必要がなく、自動的にロールバックされます。

トランザクションをコミット(完了)するためには、Completeメソッドを呼び出します。もし、TransactionScopeクラスのインスタンスを生成後、Completeメソッドを呼ばずに、TransactionScopeのスコープを抜けると、自動的にロールバックされます。

TransactionScopeクラスを利用するためには、あらかじめ参照設定で、System.Transactionsを追加してください。

参照の追加

TransactionScopeクラスを利用したサンプルプログラム

社員テーブルに1レコードを追加するプログラムを作成します。

Button1をフォームに追加して、Button1クリックハンドラに、レコードを追加を実装します。

Option Strict On
Imports System.Data.SqlClient
Imports System.Configuration  ' 参照の追加 System.Configuration
Imports System.Transactions   ' 参照の追加 System.Transactions

Public Class
FormRefTransactionScope Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim insertCount As Integer Try ' トランザクション開始 Using tran As New TransactionScope Using con As New SqlConnection Using cmd As New SqlCommand '----------< 接続関連プロパティ設定>---------- Dim settings As ConnectionStringSettings ' 接続文字列をapp.configファイルから取得 settings = _ ConfigurationManager.ConnectionStrings( _ "ado2.My.MySettings.sampleDBConStr") If settings Is Nothing Then ' 接続文字列取得エラー Throw New Exception("接続文字列がapp.configに未登録.") Else ' 接続文字列の設定 con.ConnectionString = settings.ConnectionString ' SqlCommand.Connectionプロパティの設定 cmd.Connection = con End If ' SQL文の生成 cmd.CommandText = "INSERT INTO 社員テーブル" & _ "(社員コード, 社員氏名, 社員カナ, 部署コード, 更新日時) " & _ "VALUES(@sCode, @sSimei, @sKana, @sBusho, @kosinDate)" ' SQL文の引数設定 cmd.Parameters.Clear() cmd.Parameters.Add _ (New SqlParameter("@sCode", SqlDbType.NChar, 5)) cmd.Parameters.Add _ (New SqlParameter("@sSimei", SqlDbType.NVarChar, 20)) cmd.Parameters.Add _ (New SqlParameter("@sKana", SqlDbType.NVarChar, 40)) cmd.Parameters.Add _ (New SqlParameter("@sBusho", SqlDbType.NChar, 4)) cmd.Parameters.Add _ (New SqlParameter("@kosinDate", SqlDbType.DateTime)) ' 引数に値を設定 cmd.Parameters("@sCode").Value = "00011" cmd.Parameters("@sSimei").Value = "田中一郎" cmd.Parameters("@sKana").Value = "タナカイチロウ" cmd.Parameters("@sBusho").Value = "0105" cmd.Parameters("@kosinDate").Value = Now() ' DBを開く con.Open() ' データベースの更新を実行 insertCount = cmd.ExecuteNonQuery()
End Using End Using ' 1レコード追加なら正常(これしかありえない) If insertCount = 1 Then ' トランザクション完了(コミット) tran.Complete() Else ' 1レコード追加以外なら例外をスロー ' コミットしなければ自動的にロールバック Throw New Exception _ ("社員テーブル:レコード追加処理失敗") End If End Using Catch ex As Exception ' 例外が発生したら、例外をスロー Throw New Exception("例外発生:" & ex.ToString) End Try End Sub End Class