たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

AccessVBA_ADOの利用_トランザクション【BeginTrans】【CommitTrans】【RollbackTrans】

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が動作した】▼