はじめに
担当者が不明な既存システムの端末移行を行っていたところ、C#で作成されたツールからAccess DBへアクセスするタイミングで、次のエラーが発生しました。
'Microsoft.ACE.OLEDB.12.0' プロバイダーはローカルのコンピューターに登録されていません。
今回の環境では64bit版のAccessを使用していたため、64bit版のAccess Database Engineをインストールしました。
ところが、それでもエラーが解消されません。
最終的に原因となっていたのは、Visual Studioの**「32ビットを優先」**という設定でした。
今回は実際に発生したエラーと、解決するまでの流れを備忘録としてまとめます。
発生した環境
今回エラーが発生した環境は、おおよそ次のような構成でした。
- Windows
- Microsoft 365 / Access 64bit
- Access Database Engine 64bit
- Visual Studio
- C#で作成されたツール
- Access DBを使用
端末移行に伴って環境が変わっており、旧端末は32bit環境だった可能性があります。
発生したエラー
C#ツールからAccess DBのデータを操作しようとしたところ、次のエラーが発生しました。
'Microsoft.ACE.OLEDB.12.0' プロバイダーはローカルのコンピューターに登録されていません。
接続には次のような接続文字列を使用していました。
OleDbConnection cn = new OleDbConnection(
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ACCESS_FILE_PATH
);
エラー内容だけを見ると、
Microsoft.ACE.OLEDB.12.0がPCにインストールされていないのでは?
と考えてしまいます。
そこでAccess Database Engineを確認しました。
64bit版Access Database Engineをインストール
今回使用しているAccessは64bit版だったため、Access Database Engineについても64bit版をインストールしました。
これで解決すると思ったのですが……
同じエラーが発生しました。
つまり、
64bit版のAccess Database Engineはインストールされているのに、C#からはACE OLEDBプロバイダーを利用できない
という状態です。
ここでVisual Studio側の設定を確認しました。
原因は「32ビットを優先」
Visual Studioのプロジェクト設定を確認したところ、
「32ビットを優先」
が有効になっていました。
今回の環境は、
Access Database Engine
↓
64bit
C#アプリ
↓
32bitを優先して実行
という状態になっていたことになります。
つまり、64bit版のACE OLEDBプロバイダーを用意しているにもかかわらず、C#アプリ側が32bitプロセスとして動作しようとしていたため、プロバイダーを利用できませんでした。
解決方法
Visual Studioでプロジェクトの設定を開きます。
プロジェクト
↓
プロパティ
↓
ビルド
今回のプロジェクトでは、プラットフォームターゲットが
Any CPU
になっていました。
さらに、
32ビットを優先
にチェックが入っていました。
この**「32ビットを優先」のチェックを外します。**
設定変更後に再度ビルド・実行したところ、正常にAccess DBへアクセスできるようになりました。
なぜ64bit版をインストールしたのにエラーになった?
今回一番ハマったポイントです。
最初は、
64bit版Accessを使っている
↓
64bit版Access Database Engineをインストールする
↓
これでOK
と考えていました。
しかし、実際にはACEを利用するC#アプリ側のビット数も重要でした。
今回の場合、
64bit版 Access Database Engine
↑
ビット数が不一致
↓
32bitとして動作するC#アプリ
となっていました。
「32ビットを優先」を解除することでC#アプリ側も64bitで動作するようになり、64bit版ACE OLEDBプロバイダーを利用できるようになりました。
「プロバイダーが登録されていません」が出たら確認すること
同じエラーが発生した場合、Access Database Engineを何度もインストールし直す前に、次の点を確認してみるとよいと思います。
- Accessが32bit版か64bit版か
- Access Database Engineが32bit版か64bit版か
- C#アプリが32bit・64bitのどちらで動作しているか
- Visual Studioのプラットフォームターゲット
- 「32ビットを優先」が有効になっていないか
- 接続文字列で指定しているACE OLEDBのProvider
特に、
「Access Database Engineをインストールしたのに直らない」
という場合は、アプリ側のビット数も確認してみることをおすすめします。
まとめ
今回発生した、
'Microsoft.ACE.OLEDB.12.0' プロバイダーはローカルのコンピューターに登録されていません。
というエラーは、Access Database Engineが単純にインストールされていなかっただけではありませんでした。
今回の流れをまとめると、
端末移行
↓
C#からAccess DBへアクセス
↓
ACE.OLEDB.12.0のエラー
↓
64bit版Access Database Engineをインストール
↓
まだエラー
↓
Visual Studioの設定を確認
↓
「32ビットを優先」がON
↓
チェックを外す
↓
正常に接続!
という結果でした。
エラーメッセージだけを見ると「ACEがインストールされていない」と考えてしまいますが、インストールされているACEとアプリケーションのビット数が一致しているかも重要です。
端末移行などで32bit環境から64bit環境へ変更した際には、特に注意したいポイントだと思います。
同じエラーで困っている方の参考になれば幸いです。


コメント