[C#]제공자가 oracle 클라이언트 버전과 호환되지 않습니다

2022. 11. 24. 09:23프로그래밍

728x90

오류 메시지는 다음과 같은 메시지 입니다.

내용을 들여다 보면, 초기화를 못했다는 메시지와

  • System.TypeInitializationException

그러면서 OracleConnetion이 초기화가 되지 못한 것 같습니다.

 

주요 오류 내용은

"The provider is not compatible with the version of Oracle client"

입니다.

한국어로는

"제공자가 oracle 클라이언트 버전과 호환되지 않습니다"

 

1. 문제의 시작

첫번째로 문제의 시작에 대해서 말해야 할 것 같은 데요.

  • 가. 원래 닷넷 프레임워크 3.5 부터 시작된 Oracle.Data.Access 를 프레임워크 4.5 로 올리면서 까지 사용하고 있었다는 것이고
  • 나. 어찌어찌 설정한 것을 지금까지 조심조심(?) 써 왔다는 것입니다.
  • 다. 그러다가, 갑자기 좋지 못한 상황이 발생 되서 다시 이 오라클 클라이언트 설정을 잡아야 했다는

것입니다.

 

2. ODAC 의 설치

그래서, 설치 과정이 없는 ODAC 를 사용 해보기로 결정 하였습니다.

 

Oracle Data Access Components (ODAC) for Windows Downloads

We’re sorry. We could not find a match for your search. We suggest you try the following to help find what you’re looking for: Check the spelling of your keyword search. Use synonyms for the keyword you typed, for example, try "application" instead of

www.oracle.com

 
 

참고로 64비트는

입니다.

 

3. 삽질의 역사

각 자의 PC 에 있는 개발 환경들은 어찌어찌 삽질을 해 봤더니 정말~어쩌다보니 설정을 잡았는 데,

문제는 서버에 설치 하면서 삽질이 시작 되었습니다.

다음은 결국에는 삽질한 역사가 되겠습니다.

4. 알게 된 것들

그래서, 위의 삽질의 결과 알아낸 것들은 GAC 라는 것들이랑 설정을 어떻게 잡아야 할 것인지에 대한 것들입니다.

 

4.1 Oracle.DataAccess Client 버전 별 GAC 위치

이 글로벌한 어셈블리 캐시는 버전에 따라서 들어가는 위치가 좀 틀린 데요

  • .NET 3.5 까지는 Windows 밑에 assembly에 들어가고
  • .NET 4.0 부터는 Windows 밑에 Microsoft.NET 밑에 assembly 밑에
    • 32비트의 경우 GAC32
    • 64비트의 경우 GAC64

 

들어간다는 것을 알아 냈습니다.

 

예를 들면. 내가 Oracle.Data.Access.dll 버전이 2.X 의 경우에는

Windows 밑에 assembly 에 들어가게 된다는 것입니다.

Oracle.Data.Access.dll 버전 2.X x86>

윈도우 폴더처럼 보기 위해서는 레지스트리를 건드리는 아주 위험한(?) 일을 감수 해야 하기 때문에 하지 않도록 하겠습니다(^^)

여하튼 위에서 보듯이 32비트의 경우 x84으로 64비트의 경우 AMD64 로 프로세스가 나타 나는 것입니다. 그러면, Oracle.Data.Access.dll 버전이 4.X 의 경우는 어떨까요?

.NET 4.0 부터는 Windows 밑에 Microsoft.NET 밑에 assembly 밑에 들어가게 된다는 것이죠

Oracle.Data.Access.dll 버전 4.X x86>

4.2 Oracle.DataAccess Client 맞게 설치하기

그럼, 개발을 해왔던 레거시 시스템이 있었기 때문에 원래 환경 기반으로 얘기를 해보자면

 

기본 조정 조건은

- 클라이언트는 2.X odp.net 를 사용한 32비트 버전

이라는 것입니다.

 

위에 오류 메시지를 없애기 위해서는 조심스럽게 접근 해야만 합니다.

 

우선, ODAC 를 설치한 디렉토리는

C:\oracle32와 C:\oracl64 두 개를 다 설치 하였습니다.

위 조정 조건에 따라서 본다면, 다음과 같은 명령어를 실행 해야 하겠죠

cd C:\oracle32
rem 우선 GAC를 비우자
unconfigure all [설치할 때 준 별명]
rem 그런 다음 GAC에 넣자
configure odp.net2 [설치할 때 준 별명]
 

위의 그림처럼, Windows 밑에 assembly 에 들어가게 될 것입니다.

 

4.3 machine.config?

아래 삽질을 하고, 오늘까지 삽질을 한 다음 새로 알게 된 사실입니다.

이 파일은 위 글에서 언급 했듯이 두군데 존재 합니다.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
 

따라서, 위의 기본 조정 조건인

- 클라이언트는 2.X odp.net 를 사용한 32비트 버전

으로 설치를 하게 되면 불행히도 생성 되는 곳이 없으나,

 

만약 기본 조정 조건이

- 클라이언트는 4.X odp.net 를 사용한 32/64비트 버전

으로 설치를 하게 된다면 위의 두 파일 안에 있는 내용에 추가 되거나, 수정 되게 됩니다.

중요 할 것이라고 생각 되는 파일이긴 합니다. 자세한 내용은 구글링 해보시기 바라며, 이 파일을 언급한 이유를 조금 있다가 설명 하도록 하겠습니다.

5. 컴파일 및 빌드

그럼 이때까지 사실들을 기반으로 해서 한번 컴파일과 빌드를 해 보았습니다.

코드는 아래에서 가져 왔습니다.(원본은 스택오버플로우)

 

.Net Framework Data Provider를 찾을 수 없습니다.

오류 내용은 정확히 한글: { System.ArgumentException: 요청한 .Net Framework Data Provider를 찾...

blog.naver.com

 

위의 기본 조정 조건으로 설치 된

- 클라이언트는 2.X odp.net 를 사용한 32비트 버전

으로 컴파일과 빌드를 해 보기 위해서 설정은 다음과 같이 잡았습니다.

 

비주얼 스튜디오 화면

윈도우 밑에 assembly

모든 것이 완벽 한 것 같습니다 만,

엉뚱한 메시지가 툭하고 튀어나오네요.

"요청한 .net framework data provider를 찾을 수 없습니다. 설치되지 않았을 수 있습니다 "

서두에서 언급했듯이 아무것도 없는 깨~끗한 서버이기 때문에 .NET 프레임워크가 없는 것으로 생각하고 그냥 건너 뛰겠습니다.

 

5.1 조정 조건 바꾸기

 

위의 기본 조정 조건을 다음 처럼 바꾸도록 하겠습니다.

- 클라이언트는 4.X odp.net 를 사용한 32비트 버전

 

자 그럼 위의 조정 조건 처럼 된다면 다시 환경 설정을 잡아 줄 필요가 있습니다.

cd C:\oracle32
rem 우선 GAC를 비우자
unconfigure all [설치할 때 준 별명]
rem 그런 다음 GAC에 넣자
configure odp.net4 [설치할 때 준 별명]
 

unconfigure all 해준 다음에 Windows 밑에 assembly에서 해당하는 클라이언트 버전을 삭제 하면 됩니다. 깨끗이~ ( unconfigure 해주지 않으면 지워지지 않더군요)

자 그럼

Visual Studio

Assembly 폴더

그리고 machine.config(짤리긴 했지만요...)

이렇게 하면 제대로 동작 했습니다.

 

5.3. Oracle.DataAccess 2.X 오류 해결 하기

정말 마지막으로

"요청한 .net framework data provider를 찾을 수 없습니다. 설치되지 않았을 수 있습니다 "

이 부분에 대한 오류를 다시 함 잡아 보도록 하겠습니다.

이미 위 글 마지막에서 언급 하였는데요... 해당 파일 여기서는 x86 이기 때문에

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
 

파일 내에 <DbProviderFactories> 엘리먼트를 수정 해 주면 되겠습니다.

아까도 말했지만, .NET 4.0 에서는 이 파일을 자동으로 수정 해 주지만, 그 이하에서는 다음과 같이

사용자가 수작업으로 넣어 주어야 되나 봅니다.

<system.data>
    <DbProviderFactories>
      <add name="Oracle Data Provider for .NET" 
invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" 
type="Oracle.DataAccess.Client.OracleClientFactory, 
Oracle.DataAccess, Version=2.112.4.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
 

이상.

 

728x90