投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/8/28 11:10:17
>> ADO(DAO) でのつなぎ方がわかりません
> 同じ処理の DAO (Microsoft Data Access Objects) 版です。

今度は ADO (Microsoft ActiveX Data Objects) 版です。

参照設定に、COM の
 "Microsoft ActiveX Data Objects 6.x Library"
を加えてください。このライブラリは ADODB とも呼ばれます。

ADO 系列のライブラリには、名前のよく似たサブセットの
"Microsoft ActiveX Data Objects Recordset 6.x Library"
があります(ADOR)ので間違えないようにしましょう。


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)