엑셀 파일을 DataTable로 읽어 오는 프로그램을 만들 때 OleDbConnection 에 Microsoft.Jet.OLEDB.4.0 공급자를 쓰는 경우가 많습니다. 개발 PC에서 잘 돌던 코드가 다른 PC나 서버에서 OleDbDataAdapter 를 쓰는 순간 이런 예외를 냅니다.

'Microsoft.Jet.OLEDB.4.0' 공급자는 로컬 컴퓨터에 등록할 수 없습니다.
'Microsoft.ACE.OLEDB.12.0' 공급자는 로컬 컴퓨터에 등록할 수 없습니다.

메시지만 보면 뭔가 설치가 안 된 것 같지만, 실제로는 대부분 32비트/64비트가 맞지 않아서 생깁니다.

원인은 두 가지

첫째, Jet 4.0 공급자는 32비트로만 존재합니다. 프로그램이 64비트 프로세스로 실행되면 64비트용 Jet을 찾는데, 그런 건 없으니 "등록할 수 없다"는 오류가 납니다. 빌드 대상이 Any CPU 인 프로그램은 64비트 윈도에서 64비트로 뜨기 때문에, 32비트 PC에서는 멀쩡하다가 64비트 PC나 서버로 옮기자마자 터지는 거죠. 웹 서비스도 x86 서버에서는 잘 되다가 x64 서버로 옮기면 같은 증상이 나옵니다.

둘째, xlsx 같은 새 형식을 읽으려고 ACE.OLEDB.12.0 을 쓰는데 해당 PC에 드라이버(Access Database Engine, 예전 이름 Office System Driver)가 아예 없는 경우입니다. 오피스가 깔려 있지 않은 서버에서 흔합니다.

해결 1 - 프로그램을 32비트로 실행

가장 빠른 방법은 프로젝트를 32비트로 빌드하는 겁니다. 솔루션 탐색기에서 프로젝트를 오른쪽 클릭 → 속성 → 빌드(또는 컴파일) 탭에서 플랫폼 대상을 x86 으로 바꿉니다.

Visual Studio 프로젝트 속성의 빌드 탭에서 플랫폼 대상을 x86으로 지정하는 화면

웹 애플리케이션이라면 프로젝트가 아니라 IIS 쪽을 바꿔야 합니다. IIS 관리자에서 해당 응용 프로그램 풀을 오른쪽 클릭 → 고급 설정 → 32비트 응용 프로그램 사용 을 True 로 바꾸고 풀을 재시작합니다.

IIS 응용 프로그램 풀 고급 설정에서 32비트 응용 프로그램 사용을 True로 바꾸는 화면

이 설정은 풀 단위라서, 같은 풀을 쓰는 다른 사이트도 함께 32비트로 돌게 된다는 점은 알고 바꾸세요.

해결 2 - ACE 공급자로 바꾸기

64비트로 꼭 돌려야 한다면 Jet 대신 Microsoft.ACE.OLEDB.12.0 을 쓰고, 실행할 PC에 같은 비트 수의 ACE 드라이버를 설치합니다. 64비트 프로그램이면 64비트 드라이버가 있어야 합니다. 연결 문자열은 이런 형태입니다.

' 예전 xls (Jet, 32비트 전용)
Dim connJet As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\data\list.xls;Extended Properties=""Excel 8.0;HDR=YES"";"
' xlsx (ACE, 32/64비트 드라이버 각각 존재)
Dim connAce As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\list.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"

ACE를 설치했는데도 같은 오류가 나면 드라이버와 프로그램의 비트 수가 어긋난 겁니다. 드라이버가 32비트면 해결 1처럼 프로그램도 x86으로 맞춰야 합니다. 배포할 PC마다 드라이버 설치를 챙기기 번거롭다면, 엑셀 파일 읽기만 필요한 경우 OleDb를 빼고 xlsx를 직접 읽는 라이브러리로 옮기는 것도 방법입니다. 텍스트(CSV) 파일을 OleDb로 읽는 연결 문자열과 공급자별 옵션은 아래 참고 사이트에 잘 정리돼 있습니다.

참고: Using Jet in 64 bit environments - ConnectionStrings.com