トランザクション(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 |
実行結果
関連記事
-
レコードを並べ替える(ADO)Sort プロパティ
データベースのレコードを並べ替える Sort プロパティ 【書式】 object …
-
クエリにパラメータを渡して結果を取得する(ADO)Command オブジェクト・Execute メソッド
クエリにパラメータを渡して結果を取得する手順 Command オブジェクトの作成 …
-
フィールド名(ADO)Field オブジェクト
Field オブジェクト Recordset オブジェクト内の列(フィールド)を …
-
Recordset オブジェクトの内容をワークシートにコピーする(CopyFromRecordset メソッド・ADO)
CopyFromRecordset メソッド ADO の Recordset オ …
-
テーブルの作成・削除/フィールドの作成・削除(ADOX)
ADOX を使用してテーブル・フィールド(列)を作成・削除 Table オブジェ …
-
レコードの更新(ADO)Update メソッド
データベースのレコードを更新する Update メソッド カレントレコードの内容 …
-
データベース(Oracle)に接続する(oo4o)
oo4o 接続 OO4O(Oracle Objects for OLE)はWin …
-
Recordset オブジェクト内のレコード数(ADO)RecordCount プロパティ
RecordCount プロパティ Recordset オブジェクトのレコード数 …
-
SQL文を実行する(ADO)Execute メソッド
Command オブジェクトの Execute メソッドで、SQL文を実行 Co …
-
カレントレコードの移動(ADO)MoveFirst、MoveLast、MoveNext、MovePrevious、Move
MoveFirst メソッド、MoveLast メソッド、MoveNext メソ …