トランザクション(ADO)BeginTrans、CommitTrans、RollbackTrans
2017/10/23
ADO でのトランザクション処理
Sub Sample_Transaction
<<データベース接続>> | |||
On Error GoTo ErrHandler | ……> | エラートラップ開始 | |
connection_object.BeginTrans | ……> | トランザクション開始 | |
処理1 処理2 ・ ・ ・ |
|||
connection_object.CommitTrans | ……> | 処理の確定 | |
On Error GoTo 0 | ……> | エラートラップ終了 | |
<<終了処理等>> | |||
Exit Sub | ……> | 処理が正常に行われた場合は終了 | |
ErrHandler: | ……> | エラーが発生した時、ここまで移動 | |
connection_object.RollbackTrans | ……> | すべての処理を破棄する | |
<<終了処理等>> |
End Sub
※ connection_object …… Connection オブジェクト
BeginTrans メソッド
object.BeginTrans
引数・戻り値
- object ・・・ 対象となる Connection オブジェクトを指定します。
- 戻り値 ・・・ トランザクションのネストのレベルを示す長整数型(Long)の値。
BeginTrans メソッドを呼び出すと、CommitTrans メソッド または RollbackTrans メソッドを呼び出しトランザクションを終了するまで、変更は実行されません。
CommitTrans メソッド
object.CommitTrans
CreateObject 関数
- object ・・・ 対象となる Connection オブジェクトを指定します。
CommitTrans メソッドを呼び出すとその接続上で開いているトランザクションに加えた変更が保存され、トランザクションが終了します。開いているトランザクションが存在しない場合、エラーが発生します。
RollbackTrans メソッド
object.RollbackTrans
CreateObject 関数
- object ・・・ 対象となる Connection オブジェクトを指定します。
RollbackTrans メソッドを呼び出すとその接続上で開いているトランザクションに加えた変更がすべて元に戻され、トランザクションが終了します。開いているトランザクションが存在しない場合、エラーが発生します。
トランザクション 使用例
サンプルVBAソース その1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
Sub Sample_Transaction1() '参照設定:Microsoft ActiveX Data Objects 6.1 Library Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim DBFile As String Dim i As Long Dim j As Long Dim strSQL1 As String Dim strSQL2 As String Dim rcnt As Long DBFile = ActiveWorkbook.Path & "\mydb1.accdb" constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBFile strSQL1 = "delete from テーブル4 " & _ "where 社員ID in('E0040','H0055')" strSQL2 = "select * from テーブル4 where 部署C > 104 order by 社員ID" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command cmd.ActiveConnection = cn On Error GoTo ErrHandler 'トランザクションの開始 cn.BeginTrans With cmd .CommandText = strSQL1 .Execute RecordsAffected:=rcnt End With '処理を確定(トランザクション終了) cn.CommitTrans On Error GoTo 0 ErrHandler: 'エラー発生時は処理を元に戻す(トランザクション終了) If Err.Number <> 0 Then cn.RollbackTrans cmd.CommandText = strSQL2 Set rs = cmd.Execute With Worksheets("Sheet1") .Cells.Clear i = 1 .Cells.Clear Do Until rs.EOF For j = 0 To rs.Fields.Count - 1 If i = 1 Then .Cells(i, j + 1) = rs(j).Name .Cells(i + 1, j + 1) = rs(j).Value Next j rs.MoveNext i = i + 1 Loop .Columns("A:H").AutoFit End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub |
実行結果
サンプルVBAソース その2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
Sub Sample_Transaction2() '参照設定:Microsoft ActiveX Data Objects 6.1 Library Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim DBFile As String Dim i As Long Dim j As Long Dim strSQL As String Dim strSQL1 As String Dim strSQL2 As String Dim strSQL3 As String Dim rcnt 'RecordsAffected DBFile = ActiveWorkbook.Path & "\mydb1.accdb" constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBFile strSQL1 = "insert into " & _ "テーブル4 (社員ID,氏名,フリガナ,性別,部署C,入社年月日) " & _ "values ('E0040','田野仁','タノヒトシ','男',105,#1995/4/2#)" strSQL2 = "insert into " & _ "テーブル4 (社員ID,氏名,フリガナ,性別,部署C,入社年月日) " & _ "values ('H0055','国立浩司','クニタチコウジ','男',105,#1999/4/20#)" strSQL3 = "select * from テーブル4 where 部署C > 104 order by 社員ID" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command cmd.ActiveConnection = cn On Error GoTo ErrHandler 'トランザクションの開始 cn.BeginTrans With cmd .CommandText = strSQL1 .Execute .CommandText = strSQL2 .Execute End With '処理を確定(トランザクション終了) cn.CommitTrans On Error GoTo 0 ErrHandler: 'エラー発生時は処理を元に戻す(トランザクション終了) If Err.Number <> 0 Then cn.RollbackTrans cmd.CommandText = strSQL3 Set rs = cmd.Execute With Worksheets("Sheet1") .Cells.Clear i = 1 .Cells.Clear Do Until rs.EOF For j = 0 To rs.Fields.Count - 1 If i = 1 Then .Cells(i, j + 1) = rs(j).Name .Cells(i + 1, j + 1) = rs(j).Value Next j rs.MoveNext i = i + 1 Loop .Columns("A:H").AutoFit End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub |
実行結果
関連記事
-
データベース(Oracle)に接続する(oo4o)
oo4o 接続 OO4O(Oracle Objects for OLE)はWin …
-
レコードの更新(ADO)Update メソッド
データベースのレコードを更新する Update メソッド カレントレコードの内容 …
-
フィールド名(ADO)Fields コレクション
Fields コレクション Recordset オブジェクト内の1つ以上の列(フ …
-
CSVファイルに接続(ADO)
ADOでCSVファイルに接続 ADO を使用してCSVファイルを読み込みます。C …
-
データベース(Oracle)に接続する(ODBC を使用)
ODBC接続(ADO) ADOで、ODBC(Open Database Conn …
-
インデックス、プロパティの設定(ADOX)
インデックスを作成する index オブジェクト 【書式】 <CreateObj …
-
BOF プロパティ・EOF プロパティ(ADO)
EOF プロパティ・BOF プロパティ BOF プロパティは、カレントレコードの …
-
レコードの削除(ADO)Delete メソッド
データベースのレコードを削除する Delete メソッド カレントレコードを削除 …
-
クエリの作成・削除(ADOX)
ADOX を使用してクエリを作成・削除 クエリを作成する手順 【書式】 <参照設 …
-
データベース(Oracle)に接続する(OLE DB を使用)
OLE DB プロバイダ OLE DBには、Oracle 提供の Oracle …