Microsoft.ACE.OLEDBについてまとめてみた


はじめに

最近は、Windows 10 PCを購入すると64bitになっています。プリインストール版のOfficeも64bitです。
Windows 10 のバージョン2004からは、OEM用にて32bitが提供されなくなります。
https://docs.microsoft.com/en-us/windows-hardware/design/minimum/minimum-hardware-requirements-overview#31-processor

企業では使用アプリケーションやExcelのマクロやVBAなどの動作も考慮して、Windows 10 64bit版でもOffice 32bit版をインスールされていることが多いです。
下記サイトでは、Microsoftの推奨値を記載しています。
Microsoft Officeにて32bit、64bitどちらを使うか問題
Office 365・2019では64bitが推奨値、Office 2016、2010、2013では32bitが推奨値です。

この記事は、Visual Basic Advent Calendar 2020の13日目の記事となります。11月22日に先行記事として書きました。Visual Basicでは記事が少ないので、今年書いた記事ならOKにしています。

Microsoft.ACE.OLEDB

64bit版Windowsには「Microsoft.Jet.OLEDB.4.0」が提供されていません。MDBやExcelの操作をしようとした場合に「'Microsoft.Jet.OLEDB.4.0' プロバイダはローカルのコンピュータに登録されていません。」のエラーが発生します。
64bit版Windowsでの「Microsoft.Jet.OLEDB.4.0」について

その場合、「Microsoft.ACE.OLEDB.XX.0」に切り替えるなどの対応が必要になります。「Microsoft.ACE.OLEDB」は64bitと32bitの両方が提供されていますし、下記表のようにサポートするファイルが多くなります。

Engine dBase Access Text Excel
Jet .dbf .mdb .txt
.csv
.xls
Ace .dbf
.ndx
.mdx
.mdb
.accdb
.txt
.csv
.xls
.xlsx
.xlsm
.xlsb

OLEDBプロバイダの一覧取得

.NETにはOLEDBの一覧を取得するライブラリがあるので、これをPowerShellから呼べば一覧が取得できる。

64bit版
powershell.exe
PS > (New-Object data.oledb.oledbenumerator).getElements() | select SOURCES_NAME, SOURCES_DESCRIPTION
32bit版
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
PS > (New-Object data.oledb.oledbenumerator).getElements() | select SOURCES_NAME, SOURCES_DESCRIPTION

接続文字列

ACEプロバイダとAccesssバージョン

  • Microsoft.ACE.OLEDB.12.0(Access2007,Access2010)
  • Microsoft.ACE.OLEDB.15.0(Access2013)
  • Microsoft.ACE.OLEDB.16.0(Access2016)

※Access2013は Microsoft.ACE.OLEDB.12.0 として呼び出すと例外吐くようなので、15.0として呼び出すか、上のコンポーネントを入れます。2016は12.0 or 16.0どちらでも。
参照:ADO.NETでExcelファイルに接続する

マイクロソフトでは13という数字は忌み番のため内部バージョンはスキップされる。
13と色にまつわる話

ACEのインストール

「Microsoft.ACE.OLEDB.XX.0」は、Windowsインストーラー形式(MSI)のOfficeをインストールすれば利用できるようになります。
それ以外の方法では、「Microsoft Access データベース エンジン 再頒布可能コンポーネント」などで別途インストールする必要があります。

Accessランタイムのインスールでも可能です。

クイック実行形式のOfficeの場合

クイック実行形式は Office 2013から採用され、Office 365(Office 2019)ではクイック実行形式のみがリリースされました。

クイック実行形式の Office 製品をインストールした際に、 Office に付属している ODBC ドライバや OLEDB に関するファイルやレジストリ情報が Windows インストーラー形式をインストールした時とは異なる形で登録されます。
64bit MS-Access 2019をインストールしているのに、SQL-ServerでACE.OLEDB.12.0が使えないピンチ!!

クイック実行形式の Office をインストールすると ODBC/OLEDB が利用できないので、「Microsoft Access データベース エンジン 再頒布可能コンポーネント」などで別途インストールが必要となります。

ACEの32/64ビットの共存

Officeは32bitと64bitのサイドバイサイドインストール(共存)はできませんが、「Microsoft Access データベース エンジン」は32/64ビットの共存は可能です。

64bit版がインストール済みの場合

「Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント」の32bit版をダウンロード(英語版のみ)して、コマンドプロンプト上で「/quit」コマンドを使用してインストールします。

AccessDatabaseEngine.exe /quiet

32bit版がインストール済みの場合

「Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント」の64bit版をダウンロード(英語版のみ)して、コマンドプロンプト上で「/quit」コマンドを使用してインストールします。

AccessDatabaseEngine_x64.exe /quiet

もし、これでダメなら下記の方法を試して見てください。

AccessDatabaseEngine_X64.exeからaceredist.msiを抽出し、aceredist.msiを実行します。

AccessDatabaseEngine_X64.exe / extract:c:\ adbe2016_x64
msiexec /ic:\adbe2016_x64\aceredist.msi/passive
MSIコマンド コマンドの説明
quiet サイレント・モード、ユーザーとの対話はない
passive 無人モード - 進行状況バーのみ表示

Micosoft Access起動時にエラー

Office 32bit版で、AccessDatabaseEngine 64bitをインストールしました。
Micosoft Accessを起動した際に下記のエラーが出るようになりました。そのため、AccessDatabaseEngine 64bitをアンインストールして見るとこのエラーは出なくなりました。
Micosoft Accessを使わないならいいかも知れませんが、ユーザーに迷惑がかかりますね。

Officeの共存

Officeでは同じ内部バージョンでは共存はできないが、別内部バージョンなら制限はないです。
別内部バージョンでもクイック実行形式では共存できない。

例としてOffice 365の64bitとOffice 2010の32bitは共存可能。
Office 365の64bitに、Access 2010 Runtimeの32bitはインスールすることができる。

Office リリース バージョン インストール テクノロジ
Office 365(Office 2019) 16.0 クイック実行
Office 2016 16.0 クイック実行
Office 2013 15.0 クイック実行
Windows インストーラー (MSI)
Office 2010 14.0 Windows インストーラー (MSI)

インストールエラー 1935

Microsoft Access database engine 2010をインストールしたら、下記のエラーが出てインストールできませんでした。

原因

イベントログビューアを参照すると、「Microsoft.VC90.CRT」のコミットエラーのようです。
製品: Microsoft Access database engine 2010 (Japanese) -- エラー 1935. アセンブリ コンポーネント {9DA4DC8A-9731-3F0E-8BD5-FC17CA6848AD} のインストール中にエラーが発生しました。HRESULT: 0x80073712。アセンブリ インターフェイス: IAssemblyCacheItem、関数: Commit、アセンブリ名: Microsoft.VC90.CRT,version="9.0.30729.4148",publicKeyToken="1fc8b3b9a1e18e3b",processorArchitecture="x86",type="win32"

対応

下記の方法を試してみましたが、いずれも解決にいたりませんでした。

最終対応

Microsoft Access データベース エンジン 2016 再頒布可能コンポーネントならインストールすることが出来ました。
https://www.microsoft.com/ja-JP/download/details.aspx?id=54920

PS>(New-Object data.oledb.oledbenumerator).getElements() | select SOURCES_NAME, SOURCES_DESCRIPTION
SOURCES_NAME               SOURCES_DESCRIPTION
------------               -------------------
Microsoft.ACE.OLEDB.12.0   Microsoft Office 12.0 Access Database Engine OLE DB Provider
Microsoft.ACE.OLEDB.16.0   Microsoft Office 16.0 Access Database Engine OLE DB Provider

Microsoft.ACE.OLEDB.12.0 と Microsoft.ACE.OLEDB.16.0 のドライバーが両方ともインストールされますので、接続文字列を変更しなくても、Access 2010と同じ「Microsoft.ACE.OLEDB.12.0」がそのまま使用できます。
理屈上はプログラムの変更もなく、簡易的な検証で済むはずです。

最後に

新しくアプリケーションを作るならローカルDBとしてmdbやaccdbとか使用しないで「sqlite」を使用します。Excelファイルを読むにしてもEEPlusやNPOIやClosedXmlを使用します。
昔に作ったアプリケーションの改善作業というしがらみがあって、「Microsoft.ACE.OLEDB」を使うみたいなことになるんでよね。