ASP.net 프로젝트 에서 Oracle ODP.NET 11g (11.1.0.6.20) Instant Client 를 데이터 공급자로 사용 하려고하는데 aspx 페이지를 실행하면 ” 공급자가 버전과 호환되지 않습니다. Oracle 클라이언트의 “오류 메시지. 도움을 주시면 감사하겠습니다.
Visual Studio 2005에서 데이터 공급자를 참조했으며 뒤에 코드는 다음과 같습니다.
using Oracle.DataAccess.Client;
..
OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
"Data Source=MyOracleServerName;" +
"Integrated Security=SSPI";
oOracleConn.Open();
//Do Something
oOracleConn.Close();
페이지의 오류는 다음과 같습니다.
Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client
Source Error:
Line 21:
Line 22:
Line 23: OracleConnection oOracleConn = new OracleConnection();
Line 24: oOracleConn.ConnectionString =
Line 25: "Data Source=MyOracleServerName;" +
[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
Oracle.DataAccess.Client.OracleInit.Initialize() +494
Oracle.DataAccess.Client.OracleConnection..cctor() +483
Stack Trace:
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
Oracle.DataAccess.Client.OracleConnection..ctor() +0
Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436
답변
나는이 문제를 더 자세히 조사했으며 ODP.Net은 혼합되지 않기 때문에 까다 롭기 때문에 동일한 다운로드 버전의 ODP.Net에서 모든 적절한 DLL을 가져 와서 Exe 파일과 동일한 폴더에 넣으면됩니다. 버전 번호.
내가 여기에이 작업을 수행하는 방법을 설명했습니다 http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c
여기 불구의 요지는 다음과 같습니다
- ODP.Net 다운로드
- 파일 압축을 풉니 다
- 모든 JAR 파일의 압축을 풉니 다
- 압축이 풀린 다음 dll을 가져옵니다.
- oci.dll ( ‘oci.dll.dbl’에서 이름 변경)
- Oracle.DataAccess.dll
- oraociicus11.dll
- OraOps11w.dll
- orannzsbb11.dll
- oraocci11.dll
- ociw32.dll ( ‘ociw32.dll.dbl’에서 이름 변경)
- 모든 DLL을 C # Executable과 동일한 폴더에 넣습니다.
답변
우선 모든 x86 / x64 대화를 “무시”하고 대신 .Net v4 +를 사용하는 경우 ODP.NET 관리 드라이버를 사용해보십시오.
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
Oracle ODP.net 관리 형 및 비 관리 형 드라이버
아키텍처가 어떤 DLL을 “관리되지 않는”모든 DLL을 피하십시오! : D (Oracle 시간에 관하여).
NuGet 패키지 (11g에서도 작동) :
이전 / 수동 방법 :
관리되는 라이브러리 를 사용하여 변환하는 방법에 대한 정보 :
- 먼저 관리되는 코드 와 관리되지 않는 코드를 비교 한 코드는 다음과 같습니다. http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
- ODP.NET, Managed Driver Xcopy 버전 만 다운로드했는지 확인하십시오
- 다운로드 한 zip 파일에서 프로젝트 디렉토리에 복사하여 붙여 넣으십시오.
- Oracle.ManagedDataAccessDTC.dll
- Oracle.ManagedDataAccess.dll
- Oracle.ManagedDataAccess.dll에 대한 참조 추가
- 두 개의 dll과 함께 exe가 릴리스 ( VS2010의 응용 프로그램 폴더 에 추가)되었는지 확인하십시오.
답변
난 단지 설치된 .NET 2.0 (11.1.0.6.20) 오라클 데이터 공급자 와 내가 설치하지 않은 오라클 인스턴트 클라이언트 (11.1.0.6.0) .
방금 설치했는데 오류가 사라졌습니다!
답변
32 비트 Oracle 클라이언트에 대해 64 비트 .NET 런타임을 실행하면 발생할 수 있습니다. 서버에서 64 비트로 앱을 실행하는 경우 발생할 수 있습니다. 64 비트 런타임으로 .NET 앱을 실행합니다. VS에서 프로젝트의 CPU 플래그를 32 비트 런타임에서 실행하도록 설정할 수 있습니다.
답변
어떤 종류의 요약을하자 :
오류 메시지 “제공자가 Oracle 클라이언트 버전과 호환되지 않습니다” 는 몇 가지 이유로 발생할 수 있습니다.
-
Oracle 클라이언트가 설치되어 있지 않습니다. 이 경우 오류 메시지는 실제로 잘못된 것입니다.
Oracle Data Provider for .NET (ODP.NET, 즉 파일
Oracle.DataAccess.dll
)은 Oracle Instant Client에 포함되어 있지 않으므로 별도로 설치해야합니다 ( 32 비트 Oracle Data Access Components (ODAC) 또는 64 비트 Oracle Data Access Components ( ODAC) 다운로드 ) 또는 OUI (Oracle Universal Installer)에서 옵션을 선택해야합니다.Oracle Data Provider> = 12.1을 설치할 때 해당 제공자는 GAC에 자동으로 등록되지 않습니다. 필요한 경우 수동으로 등록해야합니다 (Oracle Doc 2272241.1 참조) .
-
ODP.NET 버전이 설치된 Oracle Client 버전과 일치하지 않습니다. 부 버전 번호도 확인해야합니다! 예를 들어,
Oracle.DataAccess.dll
버전 4.112.3.0 은 Oracle Client 11.2.0.4 와 호환되지 않습니다 . ODP.NET 및 Oracle Client 버전을 신중하게 확인하십시오. sigcheck onoraociei*.dll
및 / 또는OraOps*w.dll
Oracle Client 버전을 사용할 수 있습니다 .다른 번호 매기기 체계에 유의하십시오. 파일 버전 4.112.3.0 은 .NET Framework 버전 4, Oracle Release 11.2.0.3.x를 의미 합니다.
ODP.NET 버전 “1.x”, “2.x”및 “4.x”가 있습니다. 이 숫자는 Microsoft .NET Framework 버전 1.0.3705 / 1.1.4322, 2.0.50727 및 4.0.30319와 관련이 있습니다. “1.x”버전은 Oracle Client 11.1까지 사용할 수있었습니다. 버전 “4.x”는 Oracle Client 11.2와 함께 도입되었습니다
-
ODP.NET의 아키텍처 (32 비트 또는 64 비트)가 응용 프로그램 아키텍처와 일치하지 않습니다. 32 비트 응용 프로그램은 각각 32 비트 Oracle Client / ODP.NET에서만 작동합니다. 64 비트 응용 프로그램에는 64 비트 Oracle Client / ODP.NET이 필요합니다. ( ODP.NET 관리 드라이버 를 사용하지 않는 한 )
-
.NET Framework 버전이 일치하지 않습니다. 예를 들어 Target .NET Framework 2.0으로 응용 프로그램을 컴파일하면 ODP.NET 버전 4.x를 사용할 수 없습니다. .NET Framework 대상 버전은 ODP.NET 버전 이상이어야합니다.
-
버전
Oracle.DataAccess.dll
개발 컴퓨터에 (즉, 컴파일하는 동안로드 된 버전) 대상 컴퓨터의 버전보다 높다. -
그주의
Oracle.DataAccess.dll
에서로드 할 수있는 GAC 기본적으로 로컬로 제공하는 파일보다 우선합니다.
솔루션
-
ODP.NET 관리 드라이버 사용을 고려하면 Oracle 페이지 ( 64 비트 Oracle Data Access Components (ODAC) 다운로드)에서 다운로드 할 수 있습니다. 거기에서
Oracle.ManagedDataAccess.dll
파일을 응용 프로그램 디렉토리 로 복사하기 만하면 됩니다. 32 비트와 64 비트 모두에서 작동합니다. -
귀하
*.csproj
의 담당자.*.vbproj
ODP.NET에 대한 참조를 다음과 같이 편집하십시오.<Reference Include="Oracle.DataAccess"> <SpecificVersion>False</SpecificVersion> <Private>False</Private> </Reference>
속성은 같
Version=...
거나processorArchitecture=...
필요하지 않습니다.선택한 아키텍처 및 대상 .NET 프레임 워크에 따라응용 프로그램이 올바르게로드-> 100 % 확인되지 않음Oracle.DataAccess.dll
됩니다 (올바로 설치되어있는 경우)
-
대상 시스템의 Oracle Client 버전을 모르는 경우 (예 : 고객의 시스템 일 수 있음) : 위에서 언급 한 다운로드 페이지로 이동하여 Oracle Data Access Components 의 최소 XCopy 버전을 다운로드하십시오 . 압축을 풀고
Oracle.DataAccess.dll
파일 만 로컬 시스템에 복사 하십시오. VS 프로젝트 에서이 (대부분 오래된 것) DLL을 참조하십시오. 이 DLL의 버전은 응용 프로그램과 함께 작동하는 ODP.NET의 최소 버전입니다. 애플리케이션을 실행하면 GAC의 게시자 정책이 실제로 설치된 버전으로 리디렉션됩니다. -
단일 DLL을 가져 와서 특정 폴더에 복사하는 것이 현명한 접근법이라고 생각하지 않습니다. “나이키 (naked)”머신에서 작동 할 수도 있지만 대상 머신에 Oracle 제품을 설치 한 경우 버전 불일치 위험이 높습니다. 머신에서 Oracle 제품을 설치 제거하고 새로 설치하십시오. Oracle 11g (client)를 제거 / 완전히 제거하는 방법을 살펴보십시오 ? 정말 깨끗한 기계를 주문합니다.
-
32 비트 및 64 비트 애플리케이션으로 동시에 작업해야하는 경우 다음 지시 사항에 따라 두 시스템을 하나의 시스템에 설치하십시오.
가정 : Oracle Home이라고 OraClient11g_home1
하고 클라이언트 버전은 11gR2입니다.
-
설치된 Oracle 클라이언트를 선택적으로 제거하십시오.
-
Oracle x86 Client를 다운로드하여 설치하십시오 (예 :
C:\Oracle\11.2\Client_x86
-
Oracle x64 Client를 다른 폴더에 다운로드하여 설치하십시오 (예 :
C:\Oracle\11.2\Client_x64
-
명령 줄 도구를 열고 % WINDIR % \ System32 폴더로 이동 한 다음 일반적으로 폴더에
C:\Windows\System32
대한 심볼릭 링크ora112
를 만듭니다C:\Oracle\11.2\Client_x64
(아래 참조). -
폴더 % WINDIR % \ SysWOW64로 변경하고 일반적으로 폴더에
C:\Windows\SysWOW64
대한 심볼릭 링크ora112
를 만듭니다C:\Oracle\11.2\Client_x86
(아래 참조). -
수정
PATH
, 환경 변수를 같은 모든 항목을 대체C:\Oracle\11.2\Client_x86
하고C:\Oracle\11.2\Client_x64
에 의해C:\Windows\System32\ora112
, 각각 자신의\bin
하위 폴더. 참고 :C:\Windows\SysWOW64\ora112
PATH 환경에 있지 않아야합니다. -
필요한 경우 yor
ORACLE_HOME
환경 변수를C:\Windows\System32\ora112
-
레지스트리 편집기를 엽니 다. 레지스트리 값
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
을C:\Windows\System32\ora112
-
레지스트리 값
HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
을C:\Windows\System32\ora112
(notC:\Windows\SysWOW64\ora112
)으로 설정하십시오. -
끝났습니다! 이제 x86 및 x64 Oracle 클라이언트를 함께 완벽하게 사용할 수 있습니다. 즉, x86 응용 프로그램은 x86 라이브러리를로드하고 x64 응용 프로그램은 시스템을 추가로 수정하지 않고도 x64 라이브러리를로드합니다.
기호 링크를 작성하는 명령 :
cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86
몇 가지 참고 사항 :
-
두 심볼릭 링크의 이름은 모두 같아야합니다 (예 🙂
ora112
. -
나중에 ODP.NET을 수동으로 설치하려는 경우 설치에 적합한 폴더를 선택하십시오.
-
x86 (32 비트) 라이브러리 는 이름 폴더
C:\Windows\System32
에 x64 라이브러리를C:\Windows\SysWOW64
포함하고 있습니다. 혼동하지 마십시오. -
예를 들어
TNS_ADMIN
환경 변수 (TNS_ADMIN
레지스트리의 항목)를 공통 위치 로 설정하는 것이 현명한 옵션 일 수 있습니다TNS_ADMIN=C:\Oracle\Common\network
.
답변
몇 시간 동안 문제를 해결 한 후 프로젝트 bin 디렉토리에 Oracle.DataAccess.dll (v4.0)이있어 런타임이 GAC에서 Oracle.DataAccess.dll (v2.x)을로드하여이 문제가 발생한 것으로 나타났습니다. 프로젝트 참조에서 Oracle.DataAccess 항목을 제거하고 읽으면 문제가 해결되었습니다.
여기에 언급 된 다른 파일은 제 상황에서 필요하지 않은 것 같습니다.
최신 정보
“제공자가 Oracle 클라이언트 버전과 호환되지 않습니다”오류의 근본 원인은 일반적으로 관리되는 어셈블리가 버전과 일치하지 않는 관리되지 않는 라이브러리를로드하려고합니다. 당신의 Web.config에 라이브러리 경로를 지정하여 올바른 라이브러리를 사용하도록 Oracle 드라이버를 강제로 나타납니다 1
<configuration>
<oracle.dataaccess.client>
<settings>
<add name="DllPath" value="C:\oracle\bin"/>
<!-- ... -->
</settings>
</oracle.dataaccess.client>
</configuration>
답변
대상 컴퓨터에 ODP.Net을 설치하면 문제를 해결해야합니다 … dll 복사는 좋은 생각이 아닙니다 …