MSDNや、Accessのヘルプを参考にトランザクション、エラー処理を実装したExcelとAccess2010との連携サンプル
Option Explicit
Sub test()
On Error GoTo EXCEPTION
Dim conn As ADODB.Connection 'Microsoft ActiveX Data Objects 6.0 Libraryの参照設定要
Set conn = New ADODB.Connection
Dim dbRes As New ADODB.Recordset
Dim str As String
Dim IsTransaction As Boolean: IsTransaction = False 'トランザクションの開始有無
'初期化
Err.Clear
conn.Errors.Clear
str = "C:\サンプル\Database2.accdb"
With conn
.Provider = "Microsoft.ACE.OLEDB.12.0" 'access 2010
.ConnectionString = "Data Source=" & str
'排他関連(トランザクションを利用するためここでは特に何もしない)
.IsolationLevel = adXactReadCommitted '1 つのトランザクションから、他のトランザクションで行われた変更を参照できるが、参照できるのはその変更のコミット後であることを示します。
.Mode = adModeShareDenyNone '権限の種類に関係なく、他のユーザーが接続を開けるようにします。他のユーザーに対して、読み取りと書き込みの両方のアクセスを許可します。
.Open
Debug.Print .ConnectionString
End With
'トランザクション開始
conn.BeginTrans
IsTransaction = True
'処理
Dim strSQL As String
strSQL = "SELECT * FROM サンプルテーブル"
Set dbRes = conn.Execute(strSQL)
Debug.Print dbRes(1).Name
'コミット
conn.CommitTrans
'クリーンナップ
dbRes.Close
conn.Close
Set conn = Nothing
Exit Sub
EXCEPTION:
'エラー処理
Dim msgstr As String
If conn.Errors.Count > 0 Then
Dim errCurrent As ADODB.Error
For Each errCurrent In conn.Errors
msgstr = msgstr & errCurrent.Description & vbCr
msgstr = msgstr & "SQLSTATE: " & errCurrent.SqlState & vbCr
Next
conn.Errors.Clear
Else
msgstr = msgstr & Err.Description
Err.Clear
End If
If IsTransaction = True Then
conn.RollbackTrans
End If
If Not dbRes Is Nothing Then
If dbRes.State = adStateOpen Then dbRes.Close
End If
Set dbRes = Nothing
If Not conn Is Nothing Then
If conn.State = adStateOpen Then conn.Close
End If
Set conn = Nothing
MsgBox msgstr, , "Error"
End Sub

コメント