MENU

Microsoft Accessのトランザクション処理

Accessを最初使って戸惑った事は、フォームのフィールドの値を触った時点でテーブルの値も書き換えられてしまうところ。
これは当然テーブルに保存されているレコードを直接表示して触っているのですから、当たり前と言えば当たり前の事なのですが、右も左も分かっていない初心者の頃は、保存処理もしていないのに書き換わってしまう事に「なぜ?」と当時は思いました。
書店で売られている殆どの参考書には、仮テーブルを使う事や非連結でやる方法は目にした事がないですが、これをやり出すと最終本テーブルに保存する際に追加クエリ或いは更新クエリが必要で、その際複数のテーブルに処理が跨る場合は、処理中にエラーがあった時に処理前に戻す必要がありますので、トランザクション処理が必須となります。
これをやっておかないと、処理が途中でストップしますので、1つ目のテーブル保存処理は終わっているけど、2つ目のテーブル処理が出来ていない状態となり、整合性を保つことが出来ません。

トランザクション処理をやっておけば、途中でエラーで処理がストップした場合、処理前の状態に戻る(厳密には一連の処理が終わるまではテーブルに保存せず、エラーがない場合)ので、必ずやっておきましょう。

Googleで検索しておりますと、下記のサイトに分かりやすく説明してくれておりますので、引用させていただきました。

Pz-LinkCard
- URLの記述に誤りがあります。
- URL=
Private Sub サンプル_Click()

Dim cn As New ADODB.Connection
Dim cmd As ADODB.Command


If MsgBox("処理を実行しますか? ", vbYesNo, "更新確認") = vbYes Then


Set cn = CurrentProject.Connection
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn

On Error GoTo ErrorHandler

cmd.CommandText = "BEGIN TRANSACTION"
cmd.Execute

DoCmd.SetWarnings False

DoCmd.OpenQuery "クエリ1"
DoCmd.OpenQuery "クエリ2"
DoCmd.OpenQuery "クエリ3"
DoCmd.OpenQuery "クエリ4"

cmd.CommandText = "COMMIT TRANSACTION"
cmd.Execute

Set cmd = Nothing
cn.Close: Set cn = Nothing


Else

MsgBox "処理せずに終了しました。"
Exit Sub

End If




ExitErrorHandler:
Exit Sub


ErrorHandler:
cmd.CommandText = "ROLLBACK TRANSACTION"
cmd.Execute
Set cmd = Nothing
cn.Close: Set cn = Nothing
MsgBox "エラーが発生しました。処理せずに戻ります。"
End

End Sub

私はあまりクエリを使わずSQLを直接書く事が多いんですが、その場合クエリ部分に直接書いてもいいですし、関数にしてもいいと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次