【VB6・VBAメモ】ADO(ActiveX Data Object):トランザクション

ADO(ActiveX Data Object)のトランザクションの使い方についてメモしておきます。
データ保全のため、トランザクションは覚えておくと便利なので、できるだけ使うようにしたいですね。
むしろ必ず使ってもらいたい。(周辺の方々よ。。。)

以下には(私が)良く使うパターンのサンプルコードをメモしておきます。
(細かい説明はまた後日新しい記事を更新する、、、かもしれません)

【使用例】トランザクション
基本的なトランザクション開始からコミット、例外エラー時のロールバックの一連の流れのサンプルです。
Sub Sample1()
    Dim path As String
    Dim cs   As String
    Dim cn   As New ADODB.Connection
On Error GoTo proc_err
    '-----------------------------'
    'DB接続'
    path = "D:¥Sample.mdb"
    cs = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path
    Call cn.Open(cs)
    
    'トランザクション開始'
    cn.BeginTrans
    
    
    'ここでDB編集'
    
    
    'コミット'
    cn.CommitTrans
    '-----------------------------'
    GoTo proc_end
proc_err:
    'ロールバック'
    cn.RollbackTrans
proc_end:
    'DB接続解除'
    cn.Close: Set cn = Nothing
End Sub

【検証】コミット
コミットを行った場合の流れを確認してみました。
コミット後に編集したレコードが確定しています。
Sub Sample2()
    Dim path As String
    Dim cs   As String
    Dim cn   As New ADODB.Connection
    Dim rs   As New ADODB.Recordset
    '-----------------------------'
    'DB接続'
    path = "D:¥Sample.mdb"
    cs = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path
    Call cn.Open(cs)
    
    'トランザクション開始'
    cn.BeginTrans
    
    'レコードセットオープン'
    Call rs.Open("SampleTable", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect)
    rs.Index = "PrimaryKey"
    '編集前のレコードを出力'
    Debug.Print "【編集前】"
    Do Until rs.EOF
        Debug.Print " Code=" & rs!SampleCode & " Name=" & rs!SampleName
        '次レコードへ移動'
        rs.MoveNext
    Loop
    
    'レコード追加'
    rs.AddNew
    rs!SampleCode = 500
    rs!SampleName = "レコード追加"
    rs.Update
    'レコード更新'
    rs.Seek 2
    rs!SampleName = "レコード更新"
    rs.Update
    'レコード削除'
    rs.Seek 3
    rs.Delete
    
    rs.Close: Set rs = Nothing
    
    '編集後のレコードを出力'
    Call rs.Open("SampleTable", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect)
    Debug.Print "【編集後】"
    Do Until rs.EOF
        'レコードの値を出力'
        Debug.Print " Code=" & rs!SampleCode & " Name=" & rs!SampleName
        '次レコードへ移動'
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    
    'コミット'
    cn.CommitTrans
    
    'コミット後のレコードを出力'
    Call rs.Open("SampleTable", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect)
    Debug.Print "【コミット後】"
    Do Until rs.EOF
        'レコードの値を出力'
        Debug.Print " Code=" & rs!SampleCode & " Name=" & rs!SampleName
        '次レコードへ移動'
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    '-----------------------------'
    'DB接続解除'
    cn.Close: Set cn = Nothing
End Sub
【編集前】
 Code=100 Name=あいうえお
 Code=200 Name=かきくけこ
 Code=300 Name=さしすせそ
【編集後】
 Code=100 Name=あいうえお
 Code=200 Name=レコード更新
 Code=500 Name=レコード追加
【コミット後】
 Code=100 Name=あいうえお
 Code=200 Name=レコード更新
 Code=500 Name=レコード追加
【検証】ロールバック
ロールバックを行った場合の流れを確認してみました。
ロールバック後に編集したレコードが元に戻ります。

デバッグの時なんかはこんな感じで強制的にロールバックさせてみるのも便利です。
(リリース物に影響がないように気を付ける必要はありますが)
Sub Sample3()
    Dim path As String
    Dim cs   As String
    Dim cn   As New ADODB.Connection
    Dim rs   As New ADODB.Recordset
    '-----------------------------'
    'DB接続'
    path = "D:¥Sample.mdb"
    cs = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path
    Call cn.Open(cs)
    
    'トランザクション開始'
    cn.BeginTrans
    
    'レコードセットオープン'
    Call rs.Open("SampleTable", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect)
    rs.Index = "PrimaryKey"
    '編集前のレコードを出力'
    Debug.Print "【編集前】"
    Do Until rs.EOF
        Debug.Print " Code=" & rs!SampleCode & " Name=" & rs!SampleName
        '次レコードへ移動'
        rs.MoveNext
    Loop
    
    'レコード追加'
    rs.AddNew
    rs!SampleCode = 500
    rs!SampleName = "レコード追加"
    rs.Update
    'レコード更新'
    rs.Seek 2
    rs!SampleName = "レコード更新"
    rs.Update
    'レコード削除'
    rs.Seek 3
    rs.Delete
    
    rs.Close: Set rs = Nothing
    
    '編集後のレコードを出力'
    Call rs.Open("SampleTable", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect)
    Debug.Print "【編集後】"
    Do Until rs.EOF
        'レコードの値を出力'
        Debug.Print " Code=" & rs!SampleCode & " Name=" & rs!SampleName
        '次レコードへ移動'
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    
    'ロールバック'
    cn.RollbackTrans
    
    'ロールバック後のレコードを出力'
    Call rs.Open("SampleTable", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect)
    Debug.Print "【ロールバック後】"
    Do Until rs.EOF
        'レコードの値を出力'
        Debug.Print " Code=" & rs!SampleCode & " Name=" & rs!SampleName
        '次レコードへ移動'
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    '-----------------------------'
    'DB接続解除'
    cn.Close: Set cn = Nothing
End Sub
【編集前】
 Code=100 Name=あいうえお
 Code=200 Name=かきくけこ
 Code=300 Name=さしすせそ
【編集後】
 Code=100 Name=あいうえお
 Code=200 Name=レコード更新
 Code=500 Name=レコード追加
【ロールバック後】
 Code=100 Name=あいうえお
 Code=200 Name=かきくけこ
 Code=300 Name=さしすせそ


コメント
コメントする








    
この記事のトラックバックURL
トラックバック