【VB6・VBAメモ】ADOの接続先(32bit/64bit)(mdb形式/accdb形式)

32bit・64bit環境でのそれぞれのADO(ActiveX Data Object)でのDB接続方法についてメモしておきます。
Access2007からADOの接続先プロバイダが変わったらしく
mdb形式をaccdb形式に変更した場合や、Access(32bit)をAccess(64bit)に変更した場合にADOが動かなくて焦りました;

なお、DAOの参照先と違い、参照先は「Microsoft ActiveX Data Objects 6.1 Library」のままで大丈夫のようです。

バージョン別のADOの接続先

Access2007より前のバージョンでADOを使用する場合、以下の接続先を使用していたかと思います。
 「Microsoft.Jet.OLEDB.4.0」

Access2007以降、上記を残したまま、以下の接続先が追加されました。
 「Microsoft.ACE.OLEDB.12.0」
 ※12.0はおそらくAccess2007のバージョン番号かと思われますが、Access2010や2013を使用する場合でも12.0のままのようです。
  (むしろ14.0や15.0と記述すると動かない?)

また、「Microsoft.ACE.OLEDB.12.0」は32bit版と64bit版が存在するようです。
Accessのbit数と同じOLEDBがインストールされるようです。
Accessがない場合でも「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」からインストールできます。
32bit用と64bit用のそれぞれ用意されているようです。

接続元アプリケーションが32bitの場合は32bitのOLEDB、
接続元アプリケーションが64bitの場合は64bitのOLEDBが必要になるようです。

以下には各環境・拡張子での動作可否を一覧にまとめました。

Provider 接続元(32bit)+OLEDB(32bit)+mdb 接続元(32bit)+OLEDB(32bit)+accdb 接続元(64bit)+OLEDB(32bit)+mdb 接続元(64bit)+OLEDB(32bit)+accdb 接続元(64bit)+OLEDB(64bit)+mdb 接続元(64bit)+OLEDB(64bit)+accdb
Microsoft.Jet.OLEDB.4.0 × × × × ×
Microsoft.ACE.OLEDB.12.0 × ×

Access2007・2010・2013で試しましたが、どれでも同じようでした。

まとめると、接続元アプリケーションが64bit または accdbを使う場合は「Microsoft.ACE.OLEDB.12.0」を使う必要があり、
接続元アプリケーションとOLEDBのビット数は同じにしないと動作しないようです。

動作検証

検証:「Microsoft.Jet.OLEDB.4.0」+mdb
Sub Sample()
    Dim path As String
    Dim cs   As String
    Dim cn   As ADODB.Connection
On Error GoTo proc_err
    '-----------------------------'
    'DBパス'
    path = "D:¥Sample.mdb"
    '接続文字列'
    cs = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path
    
    'DB接続'
    Set cn = New ADODB.Connection
    cn.ConnectionString = cs
    Call cn.Open
    
    'DB接続成功'
    Debug.Print "DB接続成功"
    '-----------------------------'
    GoTo proc_end
proc_err:
    Debug.Print Error
proc_end:
    'DB接続解除'
    If cn.State <> adStateClosed Then cn.Close
    Set cn = Nothing
End Sub

[接続元(32bit)+OLEDB(32bit)+mdb]の場合
DB接続成功

[接続元(64bit)+OLEDB(32bit)+mdb]の場合
'Microsoft.Jet.OLEDB.4.0' プロバイダーはローカルのコンピューターに登録されていません。

[接続元(64bit)+OLEDB(64bit)+mdb]の場合
'Microsoft.Jet.OLEDB.4.0' プロバイダーはローカルのコンピューターに登録されていません。

検証:「Microsoft.Jet.OLEDB.4.0」+accdb
Sub Sample()
    Dim path As String
    Dim cs   As String
    Dim cn   As ADODB.Connection
On Error GoTo proc_err
    '-----------------------------'
    'DBパス'
    path = "D:¥Sample.accdb"
    '接続文字列'
    cs = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path
    
    'DB接続'
    Set cn = New ADODB.Connection
    cn.ConnectionString = cs
    Call cn.Open
    
    'DB接続成功'
    Debug.Print "DB接続成功"
    '-----------------------------'
    GoTo proc_end
proc_err:
    Debug.Print Error
proc_end:
    'DB接続解除'
    If cn.State <> adStateClosed Then cn.Close
    Set cn = Nothing
End Sub

[接続元(32bit)+OLEDB(32bit)+accdb]の場合
データベースの形式 'D:¥Sample.accdb' を認識できません。

[接続元(64bit)+OLEDB(32bit)+accdb]の場合
'Microsoft.Jet.OLEDB.4.0' プロバイダーはローカルのコンピューターに登録されていません。

[接続元(64bit)+OLEDB(64bit)+accdb]の場合
'Microsoft.Jet.OLEDB.4.0' プロバイダーはローカルのコンピューターに登録されていません。

検証:「Microsoft.ACE.OLEDB.12.0」+mdb
Sub Sample()
    Dim path As String
    Dim cs   As String
    Dim cn   As ADODB.Connection
On Error GoTo proc_err
    '-----------------------------'
    'DBパス'
    path = "D:¥Sample.mdb"
    '接続文字列'
    cs = "provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path
    
    'DB接続'
    Set cn = New ADODB.Connection
    cn.ConnectionString = cs
    Call cn.Open
    
    'DB接続成功'
    Debug.Print "DB接続成功"
    '-----------------------------'
    GoTo proc_end
proc_err:
    Debug.Print Error
proc_end:
    'DB接続解除'
    If cn.State <> adStateClosed Then cn.Close
    Set cn = Nothing
End Sub

[接続元(32bit)+OLEDB(32bit)+mdb]の場合
DB接続成功

[接続元(64bit)+OLEDB(32bit)+mdb]の場合
'Microsoft.ACE.OLEDB.12.0' プロバイダーはローカルのコンピューターに登録されていません。

[接続元(64bit)+OLEDB(64bit)+mdb]の場合
DB接続成功

検証:「Microsoft.ACE.OLEDB.12.0」+accdb
Sub Sample()
    Dim path As String
    Dim cs   As String
    Dim cn   As ADODB.Connection
On Error GoTo proc_err
    '-----------------------------'
    'DBパス'
    path = "D:¥Sample.accdb"
    '接続文字列'
    cs = "provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path
    
    'DB接続'
    Set cn = New ADODB.Connection
    cn.ConnectionString = cs
    Call cn.Open
    
    'DB接続成功'
    Debug.Print "DB接続成功"
    '-----------------------------'
    GoTo proc_end
proc_err:
    Debug.Print Error
proc_end:
    'DB接続解除'
    If cn.State <> adStateClosed Then cn.Close
    Set cn = Nothing
End Sub

[接続元(32bit)+OLEDB(32bit)+accdb]の場合
DB接続成功

[接続元(64bit)+OLEDB(32bit)+accdb]の場合
'Microsoft.ACE.OLEDB.12.0' プロバイダーはローカルのコンピューターに登録されていません。

[接続元(64bit)+OLEDB(64bit)+accdb]の場合
DB接続成功



<< | 3/287PAGES | >>