Dim conn As New ADODB.Connection() Dim level As Integer = 0 Try conn.Open("Provider=Microsoft.JET.OLEDB.4.0; Data Source=C:\Database\Animals.mdb") ' "Jet OLEDB:Transaction Commit Mode" パラメーターは、 ' DAO でいうところの dbForceOSFlush オプションに相当します。 ' ' この指定は必須というわけではありませんが、 ' 未設定時の既定値が 0 (コミット時に非同期的に書き込み)ですので、 ' 今回は意図的に 1 (コミット時に同期的に書き込み) を指定してみました。 Dim props As ADODB.Properties = Nothing Dim prop As ADODB.Property = Nothing Try props = conn.Properties prop = props("Jet OLEDB:Transaction Commit Mode") prop.Value = 1 Catch Finally If prop IsNot Nothing AndAlso Marshal.IsComObject(prop) Then Marshal.ReleaseComObject(prop) prop = Nothing End If If props IsNot Nothing AndAlso Marshal.IsComObject(props) Then Marshal.ReleaseComObject(props) props = Nothing End If End Try '; Jet OLEDB:Transaction Commit Mode=1 ' トランザクションを開始 level = conn.BeginTrans() ' SQL 実行 Dim sql As String = "INSERT INTO T_目マスタ VALUES (700, 'テスト', 'てすと', 1, 'ADO: ActiveX Data Objects')" ' ' 第 2 引数は出力引数であり、更新処理の影響を受けた行数が格納されます。 ' Dim affected As Object = -1 ' ' 第 3 引数で、コマンドの処理方法を指定できます。 ' Dim opt As Integer = ADODB.ExecuteOptionEnum.adExecuteNoRecords _ Or ADODB.CommandTypeEnum.adCmdText ' 1 行分の INSERT なので、affected には 1 がセットされます。 conn.Execute(sql, affected, opt) ' 今回の SQL だと、affected の結果を判断する必要は無いので、 ' いきなりコミットしても問題は無いのですが、説明のために記述。 If CInt(affected) = 1 Then ' コミット処理 conn.CommitTrans() Else ' 今回、ここに来ることはないはず。 MsgBox("失敗。INSERT された件数が 1 ではありませんでした。: " & CStr(affected)) ' ロールバック処理 conn.RollbackTrans() level -= 1 End If Catch ex As Exception ' Open() 時のエラーかもしれないし、 ' Execute() 時のエラーかもしれない。 MsgBox(ex.Message) If level > 0 Then ' ロールバック処理 conn.RollbackTrans() level -= 1 End If Finally If CBool(conn.State And ADODB.ObjectStateEnum.adStateOpen) Then conn.Close() End If End Try Marshal.ReleaseComObject(conn)