제공자가 Oracle 클라이언트 버전과 호환되지 않습니다
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
.
대상 컴퓨터에 ODP.Net을 설치하면 문제를 해결해야합니다 ... dll 복사는 좋은 생각이 아닙니다 ...
Oracle 11g (11.1.0.7.20)의 경우 Exe와 함께 다음 dll을 추가해야 작동했습니다.
- oci.dll
- OraOps11w.dll
- oraociicus11.dll (30mb에 근접)
- Oracle.DataAccess.dll
몇 시간 동안 문제를 해결 한 후 프로젝트 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>
Oracle Istant Client와 함께 ODP를 가지고 있지만 ODP가 실제 Oracle Client를 대신 사용하려고 시도한 것 같습니다. 머신에 표준 Oracle 클라이언트도 설치되어 있습니까? 오라클이 동일한 머신의 여러 클라이언트에게 왔을 때 매우 까다 롭습니다.
나는 똑같은 문제가 있었다. 응용 프로그램을 컴파일 한 후 oraociei11.dll을 삭제했습니다 (삭제 한 것을 잊었습니다). 그리고 실행하려고하는 동안이 오류가 발생했습니다. 따라서 해당 oraociei11.dll dll을 찾을 수 없으면이 오류가 표시됩니다. 이 오류가 발생하는 다른 경우가있을 수 있지만 그 중 하나 인 것 같습니다.
또한이 메시지가 표시 될 때 IIS 응용 프로그램 풀 사용 32 비트 true 또는 false 플래그를 찾으십시오.
3 시간 동안 지속 된이 문제를 해결하기 위해 수행 한 작업은 다음과 같습니다.
Oracle 홈에 위치한 이전 에는 Windows 64 비트 용 비트를 설치
C:\oracle\product\11.2.0
한 폴더라는 폴더client_1
가ODP.NET
있습니다.나중에 Visual Studio 2012로 ASP.NET 웹 API 앱을 디버깅하는 동안이 오류 메시지가 계속 나타납니다 . 공급자가 Oracle 클라이언트 버전과 호환되지 않습니다 .
Google을 검색하면
ODP.NET
64 비트를 사용했기 때문에 이런 일이 발생했습니다 . 그런 다음ODP.NET
Windows 32 비트를 잡고 설치했지만 동일한 오류 메시지가 계속 나타납니다.해결 방법 : 폴더를 삭제
client_1
하고 resinstalledODP.NET
32 개 비트를. 다소 설치 프로그램이 64 비트 버전의 비트와 32 비트 버전을 혼합했습니다. 그림을 이동...이제 다시 행복하고 새로운을 열 수 있습니다
OracleConnection
. 드디어! :)
여전히이 문제가있는 사람 :이 기사를 기반으로
http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html
서버에 Microsoft C ++ Visual Runtime Library가 없다는 것을 알았습니다. Visual Studio가 설치되어 있기 때문에 개발자 컴퓨터에 서버가 있습니다. 여기에서 (현재) 최신 버전의 라이브러리를 다운로드하여 설치했습니다.
http://www.microsoft.com/en-us/download/details.aspx?id=13523
설정을 실행하고 C #의 오라클 호출로 만들었습니다!
TLDR 버전 :
- 대신 12c 100 % 관리 공급자를 사용하십시오.
- 이전 공급자를 사용해야하는 경우 Oracle.DataAccess.dll이 올바른 버전의 관리되지 않는 Oracle Client Dll을 가리 키도록해야합니다. 머신에 여러 Oracle 클라이언트가 설치되어있는 경우 app 구성에 "DllPath"구성 변수 (아래 참조)를 포함하는 것처럼 간단하지만 새 Oracle 클라이언트를 설치해야 할 수도 있습니다.
풀 버전:
먼저 기존의 관리되지 않는 공급자 (새로운 12c 100 % 관리 공급자가 아닌)의 구성 요소를 이해해야합니다. 두 부분으로 구성되어 있습니다.
- 관리되는 .net 구성 요소-Oracle.DataAccess.dll
- 관리되지 않는 (.net이 아닌) 클라이언트
간단히 말해서 Oracle.DataAccess.dll은 .net 명령을 관리되지 않는 클라이언트에 대한 ORACLE-NET 명령으로 번역하는 래퍼 일뿐입니다.
즉, Oracle.DataAccess를로드 할 때 필요한 관리되지 않는 클라이언트 dll을 찾으려는 순서가 있습니다. 로부터 오라클 문서 :
Oracle.DataAccess.dll은 다음 순서에 따라 관리되지 않는 종속 DLL (예 : Oracle Client)을 검색합니다.
1. 응용 프로그램 또는 실행 파일의 디렉토리
응용 프로그램 구성 또는 web.config에 의해 지정된 2.DllPath 설정.
machine.config에 의해 지정된 3.DllPath 설정.
Windows 레지스트리에서 지정한 4.DllPath 설정.
HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ version \ DllPath
5. Windows PATH 환경 변수로 지정된 디렉토리.
따라서 귀하의 경우 앱은 위 의이 프로세스를 따르고 사용중인 Oracle.DataAccess.dll 어셈블리에 비해 너무 오래된 관리되지 않은 dll이있는 경로를 찾았습니다.
해당 머신의 유일한 Oracle Client 설치가 너무 오래된 것일 수 있습니다. 그러나 컴퓨터에 둘 이상의 클라이언트가 설치되어 있고 관리되지 않는 파일이 다른 설치 나 오래된 설치에서 처음 발견 된 경우에 작동합니다. 나중에 간단한 방법은 설정에서 dllPath 구성 변수를 사용하여 올바른 Oracle Home Bin 폴더를 가리 키도록하는 것입니다.
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
</oracle.dataaccess.client>
</configuration>
If you want to install a fresh copy of the client, the xcopy version is the smallest and contains the "instant client" and point the DllPath above to this new location. But any oracle client install will work.
But if you want to avoid all this unmanaged client resolution stuff, see if you can update your app to use the 100% managed provider instead - it truely is just one or two managed assemblies,without any dependency on unmananged files.
Its also possible that you aren't loading the Oracle.DataAccess.dll that you think you are if it is installed in both your bin directory and your GAC, but I think that is the less likely senario. See the assembly resolution process for more information.
Does the IIS/IWAM user have permissions on the Oracle directory? Can you connect to this data source using another app, such as Excel or Access?
We had the same problem, because the Oracle.Data.dll assembly on a network share was updated by our DBA's. Removing the reference from the project, and adding it again solved the problem.
i have the same problem but in my case i can't just copy the dlls into the bin folder, then i only 'rebind' the assembly version.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
<bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Just two steps to solve this issue.
- go to advance setting of application pool and set 'Enable 32 bit Application' flag to True.
- Make sure all Dlls in your Bin is 32 bit version now...
best of luck.
I didn't go down the road of getting new DLL's. We had a bunch of existing projects that work perfectly fine and it was only my new project that was giving me headache so I decided to try something else.
My project was using an internally developed Internal.dll that depended on Oracle.DataAccess.dll v4.112.3.0
. For some reason, when publishing, Visual Studio always uploaded v4.121.0.0
, even though it wasn't explicitly specified in any of the config files. That's why I was getting an error.
So what I did was:
- Copied Internal.dll from one of the successfully running projects to my web site's
/bin
(just to be on the safe side). - Copied Oracle.DataAccess.dll from one of the successfully running projects to my web site's
/bin
. - Add Reference to both of them from my web site.
- Finally Oracle.DataAccess reference showed up in
myWebSite.csproj
, but it showed the wrong version:v4.121.0.0
instead ofv4.112.3.0
. I manually changed the reference in
myWebSite.csproj
, so it now read:<Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86"> <SpecificVersion>False</SpecificVersion> <HintPath>bin\Oracle.DataAccess.dll</HintPath> </Reference>
I encountered this problem after I installed Oracle Data Tools for Visual Studio 2015, and then fighting with Oracle for a good hour. I decided to try reinstalling Oracle client again instead of this mess with file copying, config changes, etc., and that worked for me.
Recently I had to work on an older project where the solution and all contained projects were targeted to x32 platform. I kept on trying to copy Oracle.DataAccess.dll and all other suggested Oracle files on all the places, but hit the wall every time. Finally the bulb in the head lit up (after 8 hours :)), and asked to check for the installed ODAC assemblies and their platform. I had all the 64-bit (x64) ODAC clients installed already but not the 32 bit ones (x32). Installed the 32-bit ODAC and the problem disappeared.
How to check the version of installed ODAC: Look in folder C:\Windows\assembly. The "Processor Architecture" property will inform the platform of installed ODAC.
Eight hours is a long time for the bulb to light up. No wonder I always have to slog at work :).
Chris' solution worked for me as well. I did however get a follow error message that states:
Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Apparently, in the foreign language of Oraclish, that means that your program are either targeting all platforms, or 32-bit machines. Simply change your target platform in Project Properties to 64-bit and hope for the best.
I had the same issue with Oracle.DataAccess.dll v4.121.2.0. with 2- homes installation (32 and 64 bit versions). 32-bit version workerd, 64-bit version didn't.
In my case (after 2 days of trying) I found that the problem was permissions on the 64-bit-home version. Many Directories in that version had exclusively overridden permissions where "Authenticated Users" role did not have "Read" access, which is set by default on the parent directory. Those sub-directories included "bin", "network/admin", "nls", "oracore", "RDBMS" and possibly others. I found them by filtering out "ACCESS DENIED" result in "Process Monitor" (Procmon.exe) utility from sysinternals. Once the permissions were inherited from the parent directory to those child subdirectories everything started to work.
I didn't what to override the permissions on the whole oracle home so I did them one directory at a time, but I guess if you don't worry about security so much you can reset it on the whole corresponding oracle home directory.
- On a 64-bit machine, copy "msvcr71.dll" from C:\Windows\SysWOW64 to the bin directory for your application.
- On a 32-bit machine, copy "msvcr71.dll" from C:\Windows\System32 to the bin directory for your application.
http://randomdevtips.blogspot.com/2012/06/provider-is-not-compatible-with-version.html
Lots of theoretical answers here, but here comes a working example with code that you can copy and paste and test immediately:
- I installed the Oracle Express database OracleXE112 which already comes with some preinstalled demo tables.
- When you start the installer you are asked for a password. I entered "xxx" as password. (not used in production)
- My server runs on the machine 192.168.1.158
- On the server you must explicitely allow access for the process TNSLSNR.exe in the Windows Firewall. This process listens on port 1521. If you get a timeout error from the below code check your firewall.
- OPTION A: For C# (.NET2 or .NET4) you can download ODAC11, from which you have to add Oracle.DataAccess.dll to your project. Additionally this DLL depends on: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), msvcr80.dll. These DLLs must be in the same directory as the EXE or you must specify the DLL path in:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
. On 64 bit machines write additionally toHKLM\SOFTWARE\Wow6432Node\Oracle\...
- OPTION B: If you have downloaded ODAC12 you need Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), oraons.dll, msvcr100.dll. The Registry path is
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
- OPTION C: If you don't want huge DLL's of more than 100 MB you should download ODP.NET_Managed12.x.x.x.xxxxx.zip in which you find
Oracle.ManagedDataAccess.dll
which is only 4 MB and is a pure managed DLL which works in 32 bit and 64 bit processes as well and depends on no other DLL and does not require any registry entries. - The following C# code works for me without any configuration on the server side (just the default installation):
using Oracle.DataAccess.Client; or using Oracle.ManagedDataAccess.Client; .... string oradb = "Data Source=(DESCRIPTION=" + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))" + "(CONNECT_DATA=(SERVER=DEDICATED)));" + "User Id=SYSTEM;Password=xxx;"; (OracleConnection conn = new OracleConnection (oradb)) 사용 { conn.Open (); (OracleCommand cmd = new OracleCommand ()) 사용 { cmd.Connection = conn; cmd.CommandText = "DBA_DATA_FILES에서 TABLESPACE_NAME을 선택하십시오"; (OracleDataReader dr = cmd.ExecuteReader ()) 사용 { 동안 (dr.Read ()) { listBox.Items.Add (dr [ "TABLESPACE_NAME"]); } } } }
'Programing' 카테고리의 다른 글
Rails Model, View, Controller 및 Helper : 어디로 가는가? (0) | 2020.06.08 |
---|---|
패딩을 무시하는 절대 위치 지정 (0) | 2020.06.08 |
Vim 매크로 저장 (0) | 2020.06.08 |
두 개의 비 연속 커밋을 어떻게 스쿼시합니까? (0) | 2020.06.08 |
조각으로 Android 검색 (0) | 2020.06.08 |