본문 바로가기
연구하기/Computer Engineering

Microsoft JET 는 64 비트 모드를 지원하지 않음

by 썰렁황제 2009. 6. 30.

  이전에 작성했던 Eternal Dream 의 카드 데이터를 데이터 베이스로 옮기고, 이터널 드림 블로그의 포스트용으로 손쉽게 텍스트화 하기 위하여 간단한 어플리케이션을 짜보려고 했다. 기존 카드 데이터들이 마이크로소프트 액셀 파일로 작성되어 있었으므로, 액셀 파일에 직접 접근하든가 적절한 변환 도구 (예를 들면 MSSQL Express 버전이나 마이크로소프트 Access 등) 를 통하여 mdb 나 MSSQL 데이터베이스 포맷으로 바꾸어 사용할 예정이었다.

  일단 가장 손쉬운 것은 액셀 파일을 그대로 쓰거나 mdb 변환이었으므로, Visual Studio Express Edition 의 데이터 바인딩 서비스를 이용하여 바인딩을 시켰다.
  그런데 정작 실행하고 보니 정작 바인딩이 되어야 할 데이터 그리드 테이블이 텅 비어 있는 것이 아닌가? 뭐가 원인인지 도움말을 찾아보고 코드를 이래저래 고쳐보고, 브레이크 포인트도 찍어보고 했는데도 도통 찾을 수가 없었다.
  도저히 안되겠어서, 바인딩 시 자동 생성되는 데이터 읽기 작업을 폼 로드 시점에서 버튼 클릭 이벤트로 옮겨왔더니 당장 오류가 출력된다. 일단 이 게시물의 주제는 이거다.

  'Microsoft.ACE.OLEDB.12.0' 공급자는 로컬 컴퓨터에 등록할 수 없습니다.
 
  일단 주제는 좀 더 나중에 언급하기로 하고 왜 에러가 잡히지 않았나 확인하면,

  폼 로딩 이벤트에 작성되는 코드에서 에러가 발생하는 경우, 이 에러를 무시하는 형태로 코드가 진행되기 때문이라는 것.
  소스가 공개되어 있지 않으니 정확히는 알 수 없지만, 폼 로딩 이벤트 핸들러에서 예외가 발생하는 경우 작업을 중지시키지 않고 계속 진행시키기 위해 핸들링을 하는 듯 하다. 물론 이벤트 핸들러에서 발생하는 예외를 무시하고 진행하는 것은 굳이 .NET 이 아니더라도 Java AWT 나 Swing 등에서도 쉽게 찾아볼 수 있다. (왜 이런지는 나중에 글로 따로 쓰게 될 듯하다. 어려운 내용은 아니지만 쓰면 길어져서)
  문제는 자바와 같은 경우 핸들링은 하더라도 예외 스택 트레이싱 출력은 보통 해 주기 때문에 에러 파이프로 추출되어 나오는 오류 메시지를 보고서 오류가 났음을 인식할 수 있는데, VIsual Studio 는 이런 상황에서 아무것도 찍어주지 않았다는 거. 그러니 도통 문제가 발생해도 알 수 가 없지.


  아무튼 본론으로 다시 돌아가자.
  처음에는 해당 라이브러리들이 존재하지 않는 것으로 판단하였지만 조사 결과 그 문제는 아니었다. 권한 문제인가 하고 생각도 해봤는데 역시나.

  일단 원인이 저게 확실하다는 것을 알고 나서 구글링 시도. 워낙 긴 메시지다 보니 간단히 답이 나왔다. 같은 문제를 겪고 있던 사람이 찾은 답은 요기. 물론 이 사람도 구글링해서 찾은 답이라고 한다.

  http://walnuttree.tistory.com/114

  그냥 정리하면 JET 는 64비트 모드를 지원하지 않는다는 것이다. 따라서 mdb 나 xls 는 그대로는 64비트 모드로 동작시키는 환경에서는 답이 없다.
  링크에서 해결하는 방법은 ASP.NET 이었을 때이므로, 일반 어플리케이션이라면 .NET Framework 32비트 버전을 설치하는 게 속편한 해법이다. 사실 저 링크의 본문에서도 ASP.NET 을 32비트 버전으로 설치하는 것으로 해결하고 있다. (.NET Framework 32 비트 버전을 설치하지는 않는 듯 하지만)

  다른 해법이 있다면 좀 알려주심 감사감사

P.S 
  통상적 방법으로는 64 비트 운영체제에서 .NET Framework 3.5 를 32비트 버전으로 설치할 수 없더군요. 2.0 까지는 별도 패키지로 배포가 되었는데, 3.5부터는 하나의 패키지가 분기되는 형태로 바뀐 것으로 보이네요. 그렇다고 설치 중에 설정할 수 있는 것도 아닌데... 방법 아시는 분 좀 부탁드립니다.
반응형