【C#】Microsoft.ACE.OLEDB.12.0が登録されていません|64bit版を入れても直らない原因

システム開発

はじめに

担当者が不明な既存システムの端末移行を行っていたところ、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を何度もインストールし直す前に、次の点を確認してみるとよいと思います。

  1. Accessが32bit版か64bit版か
  2. Access Database Engineが32bit版か64bit版か
  3. C#アプリが32bit・64bitのどちらで動作しているか
  4. Visual Studioのプラットフォームターゲット
  5. 「32ビットを優先」が有効になっていないか
  6. 接続文字列で指定している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環境へ変更した際には、特に注意したいポイントだと思います。

同じエラーで困っている方の参考になれば幸いです。

コメント

タイトルとURLをコピーしました