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


157

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

답변:


91

나는이 문제를 더 자세히 조사했으며 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과 동일한 폴더에 넣습니다.

4
귀하의 솔루션이 나를 위해 일했습니다-이것을 발견하기 전에 블로그 게시물을 찾았습니다. 당신은 남자입니다. 감사! :-) 또한 최신 버전의 ODAC를 사용하여 JAR 파일의 압축을 풀 필요가 없었습니다. .dll 파일은 오라클 홈의 다양한 디렉토리에 있습니다. 간단한 Windows 검색으로 매우 빠르게 나타났습니다.
Pandincus

10
또한 개발 컴퓨터에서 최신 버전의 ODAC (11.2.0.1.2)를 사용하고 있었고 필요한 유일한 파일은 oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll이었습니다. Chris가 지적한 것처럼, 그들이 당신의 EXECUTABLE과 같은 폴더에 있는지 확인하십시오. ;-)
Pandincus

1
최신 버전처럼 들리면 dll을 쉽게 찾을 수 있습니다. 큰! 이제 오라클이 이들을 하나의 간단한 dll로 롤링하는 데 걸리는 시간 ...
Chris

Chris의 전략과 Pandincus의 라이브러리 세트가 저에게 효과적이었습니다. PowerShell을 통해 oracle 클라이언트를 호출하므로 라이브러리 세트를 PowerShell 실행 파일 디렉토리에 넣습니다.
quillbreaker

1
가능하다면 요즘 C # 관리 드라이버를 사용해야합니다.)
Chris

47

우선 모든 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의 응용 프로그램 폴더 에 추가)되었는지 확인하십시오.

3
오라클에 마침내 완전히 관리되는 드라이버가 있다는 것은 좋은 소식입니다. 그 100mb dll을 돌아 다니는 것은 실제로 부담이되었습니다.
Jafin

1
나는 / 다시 anycpu를 등으로 프로젝트를 설정할 수 있습니다 그것을 통해 이동하기 때문에 아무런 문제가 없었습니다 그것은 :) 좋은 작품 - 관리 드라이버는 나를 위해 잘 작동합니다
토드 톰슨에게

5
관리되는 공급자는 훌륭하지만 전체 공급자가 허용하는 많은 기능이 부족합니다. 즉, Oracle의 내장 암호화입니다.
Justin Skiles

1
오라클의 문서는 "산란"되는 경향이 있습니다. 다음은 지원되지 않는 일부 방법 에 대한 좋은 링크입니다 . 또한 드라이버 자체에는 readme몇 가지 제한 사항이 간략하게 나와 있습니다.
Justin Skiles

2
관리 형 드라이버 사용이 최종 솔루션입니다! 나는 유형 불일치가있을 때 보낸 모든 시간을 생각할 때마다 nitghtmare를했습니다
ettore ct

35

난 단지 설치된 .NET 2.0 (11.1.0.6.20) 오라클 데이터 공급자 와 내가 설치하지 않은 오라클 인스턴트 클라이언트 (11.1.0.6.0) .

방금 설치했는데 오류가 사라졌습니다!


3
클라이언트를 설치하는 대신 4 인스턴트 클라이언트 DLL을 EXE와 동일한 폴더에 간단히 복사 할 수 있습니까? (이 파일들 : oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris

2
@Chris : 그렇습니다. 내 경험상 oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll 및 oracle.dataaccess.dll이 필요합니다
Pakman

주변에 나를 위해 다른 방법은 - 나는 프로 바이더를 클라이언트를 설치,하지만하지 않는 게 좋을
복음 전도를.

33

32 비트 Oracle 클라이언트에 대해 64 비트 .NET 런타임을 실행하면 발생할 수 있습니다. 서버에서 64 비트로 앱을 실행하는 경우 발생할 수 있습니다. 64 비트 런타임으로 .NET 앱을 실행합니다. VS에서 프로젝트의 CPU 플래그를 32 비트 런타임에서 실행하도록 설정할 수 있습니다.


이걸로 뛰어 들었다. (32 비트) 테스트 응용 프로그램에서 작업 한 다음 IIS로 넘어갔습니다. 관련된 모든 어셈블리가 32 비트 여야하는 대신 32 비트 AppPool로 변경했습니다.
anton.burger

22

어떤 종류의 요약을하자 :

오류 메시지 "제공자가 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 on oraociei*.dll및 / 또는 OraOps*w.dllOracle 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의 담당자. *.vbprojODP.NET에 대한 참조를 다음과 같이 편집하십시오.

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>

    속성은 같 Version=...거나 processorArchitecture=...필요하지 않습니다. 선택한 아키텍처 및 대상 .NET 프레임 워크에 따라 응용 프로그램이 올바르게로드 Oracle.DataAccess.dll됩니다 (올바로 설치되어있는 경우) -> 100 % 확인되지 않음

  • 대상 시스템의 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\ora112PATH 환경에 있지 않아야합니다.

  • 필요한 경우 yor ORACLE_HOME환경 변수를C:\Windows\System32\ora112

  • 레지스트리 편집기를 엽니 다. 레지스트리 값 HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112

  • 레지스트리 값 HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEC:\Windows\System32\ora112(not C:\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.


이 IMO에는 실제 답변보다 더 많은 지식이 필요합니다. 따라서 .net 4 용 x86 응용 프로그램이 있고 데이터베이스 버전이 9i 인 경우 32 또는 64 비트 Windows가있는 경우 사용자에게 필요한 클라이언트 버전은 무엇입니까? 오라클은 모든 클라이언트 버전이 모든 DB 버전과 호환된다고 말합니다. 32 비트 사용자의 대답이 32 비트 버전을 설치하고 64 비트 사용자가 64 비트 버전을 설치하고 ODP.NET 관리 드라이버를 사용하여 통신중인 OS를 결정합니까?
Luminous

1
ODP.NET 관리 드라이버를 사용하는 경우 Oracle 클라이언트를 설치할 필요가 없습니다. 이것이 주요 이점입니다. x86 및 x64 응용 프로그램 모두에서 작동합니다. "ODP.NET 관리 드라이버"가 없으면 x86 응용 프로그램에는 데이터베이스 서버 아키텍처가 무엇이든 관계없이 x86 (즉, 32 비트) Oracle 클라이언트도 필요합니다.
Wernfried Domscheit

방금 "Microsoft Visual C ++ 2010 재배포 가능 패키지를 설치해야합니다"라는 문제가 발생했습니다. 요약에 추가해야합니다.
Jay Sullivan

1
이 오류는 Oracle 또는 ODP.NET과 관련이 있다고 생각하지 않습니다.
Wernfried Domscheit

그것은 나를 위해 일하고, Oracle.DataAccess.dllnuget 패키지에서 설치 Oracle.DataAccess.x86하고, Dll Version은 2.112.1.0이므로 Oracle Client 설치를 Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) HERE 버전과 일치 시키면 문제가 해결됩니다!
yu yang Jian

6

몇 시간 동안 문제를 해결 한 후 프로젝트 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>

감사! 귀하의 솔루션은 2 일 후에 작동한다는 아이디어를 제공합니다 (Visual Studio 2010 Net 4, Oracle 10g 클라이언트가 있음) ... GAC를 보았으며 물론 3 개의 버전의 Oracle.DataAccess.dll을 설치했습니다. "DbProviderFactories"에서 잘못된 machine.config 키를 삭제하고 ODAC1120320 x64 만 다시 설치하십시오. 그리고 그것은 작동합니다.
Hernaldo Gonzalez

5

대상 컴퓨터에 ODP.Net을 설치하면 문제를 해결해야합니다 ... dll 복사는 좋은 생각이 아닙니다 ...


5

Oracle 11g (11.1.0.7.20)의 경우 Exe와 함께 다음 dll을 추가해야 작동했습니다.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (30mb에 근접)
  4. Oracle.DataAccess.dll

130 MB를 말하고 싶습니다
Elmue

2

Oracle Istant Client와 함께 ODP를 가지고 있지만 ODP가 실제 Oracle Client를 대신 사용하려고 시도한 것 같습니다. 머신에 표준 Oracle 클라이언트도 설치되어 있습니까? 오라클이 동일한 머신의 여러 클라이언트에게 왔을 때 매우 까다 롭습니다.


2

나는 똑같은 문제가 있었다. 응용 프로그램을 컴파일 한 후 oraociei11.dll을 삭제했습니다 (삭제 한 것을 잊었습니다). 그리고 실행하려고하는 동안이 오류가 발생했습니다. 따라서 해당 oraociei11.dll dll을 찾을 수 없으면이 오류가 표시됩니다. 이 오류가 발생하는 다른 경우가있을 수 있지만 그 중 하나 인 것 같습니다.


2

또한이 메시지가 표시 될 때 IIS 응용 프로그램 풀 활성화 32 비트 true 또는 false 플래그를 찾으십시오.


2

나는 같은 문제가 있지만 내 경우에는 dll을 bin 폴더에 복사 할 수 없으며 어셈블리 버전 만 '바인딩'합니다.

<?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>

2

3 시간 동안 지속 된이 문제를 해결하기 위해 수행 한 작업은 다음과 같습니다.

  1. Oracle 홈에 위치한 이전 에는 Windows 64 비트 용 비트를 설치 C:\oracle\product\11.2.0한 폴더라는 폴더 client_1ODP.NET있습니다.

  2. 나중에 Visual Studio 2012로 ASP.NET 웹 API 앱을 디버깅하는 동안이 오류 메시지가 계속 나타납니다 . 공급자가 Oracle 클라이언트 버전과 호환되지 않습니다 .

  3. Google을 검색하면 ODP.NET64 비트를 사용했기 때문에 이런 일이 발생했습니다 . 그런 다음 ODP.NETWindows 32 비트를 잡고 설치했지만 동일한 오류 메시지가 계속 나타납니다.

  4. 해결 방법 : 폴더를 삭제 client_1하고 resinstalled ODP.NET32 개 비트를. 다소 설치 프로그램이 64 비트 버전의 비트와 32 비트 버전을 혼합했습니다. 그림을 이동...

  5. 이제 다시 행복하고 새로운을 열 수 있습니다 OracleConnection. 드디어! :)


2

여전히이 문제가있는 사람 :이 기사를 기반으로

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 #의 오라클 호출로 만들었습니다!


1
야 .. 오라클 .... 우리 약간의 토론을 할 수 있을까? 모퉁이에 이리와 잘 들어 봐, 난 "제공자가 호환되지 않는"지옥이 무엇을 의미하는지 알아 내기 위해 하루 종일을 보냈다. 아니오 - - 나는하세요 요구 당신이 당신의 설치 만드는 것이 체크 설치시 이러한 종속성을하고, 사용자에게 경고 가 충족되지 않을 경우. 감사.
Jay Sullivan

3
그건 그렇고, 여러 번이 스택 오버 플로우 질문으로 돌아와야 할 때마다 다른 대답이 나에게 적용됩니다. 이로 인해 시간과 돈이 낭비되었습니다.
Jay Sullivan

2

TLDR 버전 :

  • 대신 12c 100 % 관리 공급자를 사용하십시오.
  • 이전 공급자를 사용해야하는 경우 Oracle.DataAccess.dll이 올바른 버전의 관리되지 않는 Oracle Client Dll을 가리 키도록해야합니다. 머신에 여러 Oracle 클라이언트가 설치되어있는 경우 app 구성에 "DllPath"구성 변수 (아래 참조)를 포함하는 것처럼 간단하지만 새 Oracle 클라이언트를 설치해야 할 수도 있습니다.

풀 버전:

먼저 기존의 관리되지 않는 공급자 (새로운 12c 100 % 관리 공급자가 아닌)의 구성 요소를 이해해야합니다. 두 부분으로 구성되어 있습니다.

  1. 관리되는 .net 구성 요소-Oracle.DataAccess.dll
  2. 관리되지 않는 (.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>

새 클라이언트 사본을 설치하려면 xcopy 버전 이 가장 작고 "인스턴트 클라이언트"를 포함하고 위의 DllPath를이 새 위치로 지정하십시오. 그러나 모든 oracle 클라이언트 설치는 작동합니다.

그러나 관리되지 않는 클라이언트 해결 방법을 모두 피하려면 100 % 관리 공급자를 대신 사용하도록 앱을 업데이트 할 수 있는지 확인하십시오. 관리되지 않는 파일에 대한 종속성없이 실제로 하나 또는 두 개의 관리되는 어셈블리입니다.

bin 디렉토리와 GAC에 모두 설치되어 있다고 생각하는 Oracle.DataAccess.dll을로드하지 않을 수도 있지만 그럴 가능성은 적습니다. 자세한 내용은 어셈블리 해결 프로세스 를 참조하십시오.


1

IIS / IWAM 사용자에게 Oracle 디렉토리에 대한 권한이 있습니까? Excel 또는 Access와 같은 다른 앱을 사용하여이 데이터 소스에 연결할 수 있습니까?


1

네트워크 공유의 Oracle.Data.dll 어셈블리가 DBA에 의해 업데이트 되었기 때문에 동일한 문제가 발생했습니다. 프로젝트에서 참조를 제거하고 다시 추가하면 문제가 해결되었습니다.


1

이 문제를 해결하기 위해 두 단계 만 거치면됩니다.

  1. 응용 프로그램 풀의 고급 설정으로 이동하여 '32 비트 응용 프로그램 사용 '플래그를 True로 설정하십시오.
  2. Bin의 모든 Dll이 32 비트 버전인지 확인하십시오 ...

행운을 빕니다.


@ mazhar-abbas, 당신은 pls 수 있습니다. '32 비트 응용 프로그램 사용 '을 설정할 수있는 지점을 지적하십시오. IIS 또는 프로젝트에 있습니까?
hiFI

1

나는 새로운 DLL을 얻는 길을 가지 않았다. 우리는 완벽하게 잘 작동하는 많은 기존 프로젝트를 가지고 있었고 두통을주는 것은 새로운 프로젝트 일뿐이므로 다른 것을 시도하기로 결정했습니다.

내 프로젝트는 Oracle.DataAccess.dll에 의존하는 내부적으로 개발 된 Internal.dll을 사용하고있었습니다 v4.112.3.0. 어떤 이유로 든 게시 할 때 Visual Studio v4.121.0.0가 구성 파일에 명시 적으로 지정되어 있지 않더라도 항상 업로드 했습니다. 그래서 오류가 발생했습니다.

그래서 내가 한 일은 :

  1. 성공적으로 실행중인 프로젝트 중 하나에서 내 웹 사이트로 /bin( Internal 측에 있음) Internal.dll을 복사했습니다 .
  2. 성공적으로 실행중인 프로젝트 중 하나에서 내 웹 사이트로 Oracle.DataAccess.dll을 복사했습니다 /bin.
  3. 내 웹 사이트에서 둘 다에 대한 참조를 추가하십시오.
  4. 마지막으로 Oracle.DataAccess 참조가 myWebSite.csproj에 표시되었지만 v4.121.0.0대신 잘못된 버전 이 표시되었습니다 v4.112.3.0.
  5. 에서 참조를 수동으로 변경 myWebSite.csproj했으므로 이제 다음과 같이 읽습니다.

    <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> 

2
bin 폴더에 dll에 대한 참조를 추가하는 것은 정말 나쁜 생각입니다.
Jay Sullivan

1
binobj폴더는 출력 폴더; 프로젝트를 빌드 할 때 dll이있는 곳입니다. 충돌을 일으키지 않고 언제든지이 폴더를 삭제할 수 있어야합니다. 일반적으로 이러한 폴더는 소스 제어에서 무시 됩니다. 표준 관행은 External References참조 된 dll을 넣을 폴더 를 만드는 것 입니다.
Jay Sullivan

@notfed 당신이 옳은 것 같습니다. 내 마음에 이것을 유지합니다.
Robotron

명명 된 것처럼 컴파일러 의 힌트 경로 일뿐 이며 강제 참조는 아닙니다. 먼저 GAC에서 Oracle.DataAccess.dll을 검색합니다. HintPath완전히 삭제해도 작동합니다 .
Wernfried Domscheit

1

Visual Studio 2015 용 Oracle Data Tools를 설치 한 다음 좋은 시간 동안 Oracle과 싸운 후에이 문제가 발생했습니다. 파일 복사, 구성 변경 등 으로이 혼란 대신 Oracle 클라이언트를 다시 설치하기로 결정했으며 나에게 도움이되었습니다.


1

나는 비슷한 문제에 직면했으며 근본 원인은 GAC에 2 개의 oracle.dataaccess 버전, 즉 v4.0_4.112.2.0 및 v4.0_4.112.4.0이 있다는 것입니다. 내 응용 프로그램은 v4.0_4.112.2.0을 참조했기 때문에 GAC에서 v4.0_4.112.4.0을 제거하면 정상적으로 작동했습니다.

GAC 경로 : C : \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

전 : 여기에 이미지 설명을 입력하십시오

후 : 여기에 이미지 설명을 입력하십시오

버전을 제거하려면 GAC에서 해당 폴더를 삭제하면됩니다.


0

최근에는 솔루션과 모든 포함 된 프로젝트가 x32 플랫폼을 대상으로하는 이전 프로젝트를 수행해야했습니다. 나는 Oracle.DataAccess.dll 및 다른 모든 제안 된 Oracle 파일을 모든 곳에서 복사하려고 시도했지만 매번 벽을 쳤다. 마지막으로 헤드의 전구가 켜지고 (8 시간 후) 설치된 ODAC 어셈블리 및 해당 플랫폼을 확인하도록 요청했습니다. 모든 64 비트 (x64) ODAC 클라이언트를 이미 설치했지만 32 비트 (x32)는 설치하지 않았습니다. 32 비트 ODAC를 설치했는데 문제가 사라졌습니다.

설치된 ODAC 버전을 확인하는 방법 : C : \ Windows \ assembly 폴더를 확인하십시오. "Processor Architecture"속성은 설치된 ODAC를 플랫폼에 알려줍니다.

전구가 켜지는 데 8 시간이 걸립니다. 내가 항상 직장에서 멈춰야한다는 것은 놀라운 일이 아닙니다. :).


참고 C:\Windows\assemblies.NET 프레임 워크 버전 2.0 단지 쇼 어셈블리까지. 버전 3.x / 4.x는 표시되지 않습니다. stackoverflow.com/questions/28213105/…
Wernfried Domscheit

0

Chris의 솔루션도 저에게 효과적이었습니다. 그러나 다음과 같은 오류 메시지가 나타납니다.

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.

분명히, Oraclish의 외국어로, 이는 귀하의 프로그램이 모든 플랫폼 또는 32 비트 시스템을 대상으로한다는 것을 의미합니다. 프로젝트 속성에서 대상 플랫폼을 64 비트로 변경하고 최상의 결과를 얻으십시오.


3
실제로 Oraclish가 아닌 .NETish입니다
Jay Sullivan

0

Oracle.DataAccess.dll v4.121.2.0과 동일한 문제가있었습니다. 2 가정 설치 (32 및 64 비트 버전). 32 비트 버전은 작동했지만 64 비트 버전은 작동하지 않았습니다.

필자의 경우 (2 일간의 시도 후) 문제는 64 비트 홈 버전에 대한 권한이라는 것을 알았습니다. 해당 버전의 많은 디렉토리 는 "인증 된 사용자"역할에 "읽기"액세스 권한이없는 상위 권한을 독점적으로 대체했습니다.이 디렉토리는 기본적으로 상위 디렉토리에 설정되어 있습니다. 이러한 하위 디렉토리에는 "bin", "network / admin", "nls", "oracore", "RDBMS"등이 있습니다. sysinternals의 "Process Monitor"(Procmon.exe) 유틸리티에서 "ACCESS DENIED"결과를 필터링하여 발견했습니다. 권한이 상위 디렉토리에서 해당 하위 서브 디렉토리로 상속되면 모든 것이 작동하기 시작했습니다.

전체 오라클 홈에 대한 권한을 무시하는 방법은 없었으므로 한 번에 하나의 디렉토리를 수행했지만 보안에 대해 걱정하지 않으면 해당 오라클 홈 디렉토리에서 재설정 할 수 있습니다.



-3

여기에는 많은 이론적 답변이 있지만 즉시 복사하여 붙여 넣기 및 테스트 할 수있는 코드가있는 실제 예제가 있습니다.

  1. 이미 사전 설치된 데모 테이블과 함께 제공되는 Oracle Express 데이터베이스 OracleXE112 를 설치했습니다.
  2. 설치 프로그램을 시작할 때 비밀번호를 묻는 메시지가 표시 됩니다. 비밀번호로 "xxx"를 입력했습니다. (제작에는 사용되지 않음)
  3. 내 서버는 컴퓨터에서 실행됩니다 192.168.1.158
  4. 서버에서 Windows 방화벽 의 프로세스 TNSLSNR.exe에 대한 액세스를 명시 적으로 허용해야합니다 . 이 프로세스는 포트 1521에서 수신 대기합니다. 아래 코드에서 시간 초과 오류가 발생하면 방화벽을 확인하십시오.
  5. 옵션 A : C # (. NET2 또는 .NET4) 의 경우 프로젝트에 Oracle.DataAccess.dll을 추가 해야하는 ODAC11 을 다운로드 할 수 있습니다 . 또한이 DLL은 다음에 의존합니다 : OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), msvcr80.dll. 이 DLL은 EXE와 동일한 디렉토리에 있거나 DLL 경로를 다음에 지정해야합니다 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. 64 비트 컴퓨터에서 추가로 쓰기HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. 옵션 B : ODAC12 를 다운로드 한 경우 Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), oraons.dll, msvcr100.dll이 필요합니다. 레지스트리 경로는HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. 옵션 C : 100MB가 넘는 거대한 DLL을 원하지 않는 경우 ODP.NET_Managed12.xxxxxxxx.zip을 다운로드해야합니다. 여기서 Oracle.ManagedDataAccess.dll4MB는 32MB 및 64 비트 프로세스에서 작동하는 순수 관리 형 DLL입니다. 또한 다른 DLL에 의존하지 않으며 레지스트리 항목이 필요하지 않습니다.
  8. 다음 C # 코드 는 서버 측에서 구성하지 않고 나를 위해 작동합니다 (기본 설치 만).
Oracle.DataAccess.Client 사용;
또는
Oracle.ManagedDataAccess.Client 사용;

....

문자열 oradb = "데이터 소스 = (DESCRIPTION ="
    + "((ADDRESS_LIST = (ADDRESS = (프로토콜 = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "((CONNECT_DATA = (서버 = DEDICATED)));"
    + "사용자 ID = SYSTEM; 비밀번호 = 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"]);
            }
        }
    }
}

실행중인 클라이언트가 필요할 때 전체 Oracle 데이터베이스 서버를 설치하는 것은 과도합니다.
Wernfried Domscheit

당신은 어쨌든 가난하게 대답합니다. Oracle dll을 응용 프로그램 디렉토리에 복사 할 필요가 없습니다. 기본 설치시 기본적으로 ‰ PATH %를 통해 찾을 수 있기 때문입니다 (사용자가 직접 수정하지 않은 경우). 레지스트리 힌트는 for.version 4.x에만 적용되며 32 비트 Oracle 클라이언트 그러나이 질문의 주요 주제는 32 비트와 64 비트가 일치하지 않는 것입니다.
Wernfried Domscheit

당신은 내 대답을 읽지 않았다는 의견을 제시합니다. Oracle 서버와 통신하는 응용 프로그램을 작성하려면 Oracle에서 아무것도 설치할 필요가 없습니다. 위에서 언급 한 DLL을 사용하여 내 응용 프로그램과 함께 배포합니다. 따라서 최종 사용자 컴퓨터의 PATH 변수에는 아무것도 없습니다. 그런데 PATH 변수 (1980 년 이전 DOS 시대에서 나온)를 사용하는 것은 현대 소프트웨어에서 더 이상 사용되지 않습니다. 내 대답은 레지스트리 경로가 필요없고 32 또는 64 비트에 의존하지 않는 OPTION C를 권장합니다. 완전성에 대해서만 옵션 A와 B를 언급했습니다.
Elmue

적절한 % PATH %를 설정하지 않으면 Windows 10 버전에서도 Windows가 전혀 작동하지 않는다고 생각합니다. 내 대답에는 Oracle dll을 응용 프로그램과 함께 수동으로 복사하는 것이 현명하지 않다고 언급했습니다. 이 dll의 소스 코드를 모르지만 고객 측에 표시되지 않는 언어 설정, 문자 집합, 시간대 등으로 인해 더 많은 종속성이있을 수 있습니다 Oracle.DataAccess.dll. 프로그램은 총 35 개의 Oracle DLL로로드됩니다! 물론 ODP.NET Managed 드라이버를 사용하지 않는 한 Oracle Client를 정상적으로 설치하는 것이 좋습니다.
Wernfried Domscheit

1
나는 내 우려를 언급했다고 생각한다. (1) 데이터베이스 설치는 쓸모가 없다. (2) 옵션 A와 B는 특정 조건에서만 작동합니다. 예를 들어 레지스트리에서 NLS 설정을 읽지 않습니다 (파일이 필요함 oracle.key). 호환성을 위해서는 부 버전도 고려해야합니다. 예를 들어 버전 2.112.4.0 Oracle.DataAccess, Version=2.112.2.0에서는 작동하지 않습니다 OraOps11w.dll.
Wernfried Domscheit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.