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どちらを使うか問題](https://asohiroblog.net/office-32bit-64bit/)
Office 365・2019では64bitが推奨値、Office 2016、2010、2013では32bitが推奨値です。

この記事は、[Visual Basic Advent Calendar 2020](https://qiita.com/advent-calendar/2020/vb)の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」について](https://qiita.com/yaju/items/86314412741deb806366)

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

|Engine|dBase|Access|Text|Excel|
|:--|:--|:--|:--|:--|
|Jet|.dbf| .mdb|.txt<br>.csv| .xls|
|Ace|.dbf<br>.ndx<br>.mdx|.mdb<br>.accdb|.txt<br>.csv| .xls<br>.xlsx<br>.xlsm<br>.xlsb|

## OLEDBプロバイダの一覧取得

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

```powershell:64bit版
powershell.exe
PS > (New-Object data.oledb.oledbenumerator).getElements() | select SOURCES_NAME, SOURCES_DESCRIPTION
```

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

## 接続文字列
* [Microsoft ACE OLEDB 12.0 connection strings](https://www.connectionstrings.com/ace-oledb-12-0/)
* [Excel2010以降をJetデータベースを使うには](https://gist.github.com/toshiyukino/a4877697b69b1f6c837b5400fea8a4e9)
* [VB.NETでOleDBを使ったエクセルファイルへのアクセス](http://rnk.mitelog.jp/oyaji/2016/01/vbnetoledb-f9d8.html)
* [C#でデータベースへ接続する(Microsoft Access編)](https://araramistudio.jimdo.com/2020/06/25/c-%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B-microsoft-access%E7%B7%A8/)

## 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ファイルに接続する](http://qiita.com/unarist/items/6cc35bb9fe502ced332f)

マイクロソフトでは13という数字は忌み番のため内部バージョンはスキップされる。
[13と色にまつわる話](https://qiita.com/yaju/items/4353f621cff3bcc7ed72)

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

* [「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」のダウンロード](https://www.microsoft.com/ja-jp/download/details.aspx?id=13255)
* [「Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント」のダウンロード(英語版のみ)](https://www.microsoft.com/en-us/download/details.aspx?id=54920)

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

* [Microsoft Access 2013 Runtimeのダウンロード](https://www.microsoft.com/ja-jp/download/details.aspx?id=39358)
* [Microsoft Access 2016 Runtimeのダウンロード](https://www.microsoft.com/ja-jp/download/details.aspx?id=50040)
* [Microsoft 365 Access ランタイムをダウンロードしてインストールする](https://support.microsoft.com/ja-jp/office/microsoft-365-access-%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B-185c5a32-8ba9-491e-ac76-91cbe3ea09c9)

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

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

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

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

### 64bit版がインストール済みの場合
「Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント」の[32bit版をダウンロード(英語版のみ)](https://www.microsoft.com/en-us/download/details.aspx?id=54920)して、コマンドプロンプト上で「/quit」コマンドを使用してインストールします。

```
AccessDatabaseEngine.exe /quiet
```

### 32bit版がインストール済みの場合
「Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント」の[64bit版をダウンロード(英語版のみ)](https://www.microsoft.com/en-us/download/details.aspx?id=54920)して、コマンドプロンプト上で「/quit」コマンドを使用してインストールします。

```
AccessDatabaseEngine_x64.exe /quiet
```

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

* [Microsoft Acces Database Engine 2016 の32bit/64bit版の共存方法](https://qiita.com/Y_MAGARI000/items/5f6735c5c870069b08b7)
* [Microsoft Access Database Engine 2016 Redistributable won't install due to 64-bit component.](https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/c159dec1-1b83-45e3-8493-9d3a8fbec4c2/microsoft-access-database-engine-2016-redistributable-wont-install-due-to-64bit-component?forum=officegeneral)

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を使わないならいいかも知れませんが、ユーザーに迷惑がかかりますね。
![access32and64bit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/7396c1b6-5b8d-b356-e80e-3fd61847ce0a.png)

# 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|クイック実行<br>Windows インストーラー (MSI)|
|Office 2010|14.0|Windows インストーラー (MSI)|

* [Can Access 2013 Runtime 32bit coexist with Office 64bit](https://social.technet.microsoft.com/Forums/en-US/3e096f7b-e8be-43c4-8a3f-b33fb481f3a0/can-access-2013-runtime-32bit-coexist-with-office-64bit?forum=officeitpro)
* [同一コンピューター上に異なるバージョンの Office、Project、Visio をインストールするためのサポート対象シナリオ](https://docs.microsoft.com/ja-jp/deployoffice/install-different-office-visio-and-project-versions-on-the-same-computer)

# インストールエラー 1935
Microsoft Access database engine 2010をインストールしたら、下記のエラーが出てインストールできませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/09bad575-37c1-9bdf-b562-31e73effe800.png)

## 原因
イベントログビューアを参照すると、「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"

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

* [Error 1935 - An error occured during the installation of assembly component...](https://www.winway.com/main3/support/kb/Q000201.aspx)
* [Windows10のOfficeインストールエラー1935（0x80131049）の対処法・解決策](https://eijiman.com/windows10-office-error-1935/)
* [インストールのトラブル解決！③ - 「エラー1935」](http://kyosapo.blogspot.com/2011/05/1935.html)

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

```powershell
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ファイルを読むにしてもEPPlusやNPOIやClosedXmlを使用します。
昔に作ったアプリケーションの改善作業というしがらみがあって、「Microsoft.ACE.OLEDB」を使うみたいなことになるんでよね。