ADOでデータベースに接続し、データベースに対する作業をまとめ ある一連の作業をひとつの処理にまとめたもののこと ある地点でエラーが起こった場合の処理を分岐して、エラーの場合にはそれまでの変更を取り消ししたうえで処理を抜け ・BeginTransメソッドトランザクションを開始 ・ステートメント カレントプロジェクトのデータベースに接続する場合の記述 ▼メッセージボックスの表示▼ カレントプロジェクトのデータベースに接続する場合の記述 ▼メッセージボックスの表示▼
条件によっては変更処理の取り消しが可能となるように記述することで、データの整合性を保つ
今回の記述に関する前情報
トランザクションとは
その一連の処理(トランザクション)を、確定したり、取り消したりできるようにするのが以下の書式にある各メソッド
何を行うか
そうでない場合には変更をコミットする利用時の書式
∟Connectionオブジェクト変数.BeginTrans
・CommitTransメソッドトランザクションを確定(保存)
∟Connectionオブジェクト変数.CommitTrans
・RollbackTransメソッド_それまでの変更処理を取り消してトランザクションを終了
∟Connectionオブジェクト変数.RollbackTrans記述例における利用パーツ
→Do Loop / If / On Error
▼On Errorステートメントに関する解説記事▼
【VBA入門】エラーを処理する方法(On Error、Resume、GoTo) | 侍エンジニアブログ
・メソッド
→BeginTrans / CommitTrans / RollbackTrans
→Update / MoveNext / Open / Close
【実践】指定のテーブルでトランザクションを行う記述例【エラーを起こすVer.】
テーブル「yubin_data_base」のフィールド「prefecture」が"ほっかいDo"の場合に、
フィールド「city」の値を12で割ってエラーを起こし処理を取り消してトランザクションを終了
※フィールドの値が"ほっかいDo"でない場合にはフィールド「city」の値は変更なし、トランザクションを確定する
▼取得対象テーブル「yubin_data_base」▼
▼記述例▼
Sub trans_test()
Dim CNT As ADODB.connection
Dim RST As ADODB.Recordset
Set CNT = CurrentProject.connection
Set RST = New ADODB.Recordset
RST.Open "yubin_data_base", CNT, adOpenKeyset, adLockOptimistic
On Error GoTo Err
CNT.BeginTrans 'トランザクションを開始
Do Until RST.EOF
If RST("prefecture") = "ほっかいDo" Then
RST("city") = RST("city") / 12
Else
RST("city") = RST("city")
End If
RST.Update
RST.MoveNext
Loop
CNT.CommitTrans
MsgBox "トランザクション確定"
Exit Sub
Err:
CNT.RollbackTrans
MsgBox "トランザクション取り消し"
End Sub
▼実行結果_変更なし【RollbackTransが動作した】▼
※Updateメソッドを使用しているものの、エラーだったので何も変更が加えられていないことがわかる
【実践】指定のテーブルでトランザクションを行う記述例【エラーが起きないVer.】
テーブル「yubin_data_base」のフィールド「prefecture」が"ほっかいDo"の場合に、
フィールド「city」の値を”ほっかいDoooooou”に変更しトランザクションを確定する
※フィールドの値が"ほっかいDo"でない場合にはフィールド「city」の値は変更なし、トランザクションを確定する
▼取得対象テーブル「yubin_data_base」▼
▼記述例▼
Sub trans_test()
Dim CNT As ADODB.connection
Dim RST As ADODB.Recordset
Set CNT = CurrentProject.connection
Set RST = New ADODB.Recordset
RST.Open "yubin_data_base", CNT, adOpenKeyset, adLockOptimistic
On Error GoTo Err
CNT.BeginTrans 'トランザクションを開始
Do Until RST.EOF
If RST("prefecture") = "ほっかいDo" Then
RST("city") = "ほっかいDoooooou"
Else
RST("city") = RST("city")
End If
RST.Update
RST.MoveNext
Loop
CNT.CommitTrans
MsgBox "トランザクション確定"
Exit Sub
Err:
CNT.RollbackTrans
MsgBox "トランザクション取り消し"
End Sub
▼実行結果_変更確定【CommitTransが動作した】▼