O provedor não é compatível com a versão do cliente Oracle

Eu estou tentando usar o Oracle ODP.NET 11g (11.1.0.6.20) Instant Client no meu projeto ASP.net como um provedor de dados, mas quando eu executar a página aspx recebo um ” O provedor não é compatível com a versão do cliente Oracle “mensagem de erro. Qualquer ajuda seria apreciada.

Eu referenciei o Data Provider no Visual Studio 2005 e o código por trás se parece com isso:

using Oracle.DataAccess.Client; .. OracleConnection oOracleConn = new OracleConnection(); oOracleConn.ConnectionString = "Data Source=MyOracleServerName;" + "Integrated Security=SSPI"; oOracleConn.Open(); //Do Something oOracleConn.Close(); 

O erro da página é semelhante ao seguinte:

 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 

    Eu estive olhando para este problema ainda mais, e você simplesmente precisa pegar todas as DLLs apropriadas da mesma versão baixada do ODP.Net e colocá-las na mesma pasta que o seu arquivo Exe, porque o ODP.Net é muito exigente em não misturar números de versão.

    Eu expliquei como fazer isso aqui: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c Aqui está a essência:

    • Faça o download do ODP.Net
    • Descompacte o arquivo
    • Descompacte todos os JAR’s nele
    • Pegue estas DLLs que foram descompactadas:
      • oci.dll (renomeado de ‘oci.dll.dbl’)
      • Oracle.DataAccess.dll
      • oraociicus11.dll
      • OraOps11w.dll
      • orannzsbb11.dll
      • oraocci11.dll
      • ociw32.dll (renomeado de ‘ociw32.dll.dbl’)
    • Coloque todas as DLLs na mesma pasta que seu executável C #

    Você deve “ignorar” todas as conversas x86 / x64 aqui para iniciantes e, em vez disso, tente o driver gerenciado ODP.NET (se você estiver usando .Net v4 +):

    https://www.nuget.org/packages/Oracle.ManagedDataAccess/

    https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

    Driver Oracle ODP.net Gerenciado vs Não Gerenciado

    Evite todos os “não gerenciados” que DLL que problemas de arquitetura! : D (sobre o tempo da Oracle).

    O pacote NuGet (também funciona para 11g):

    insira a descrição da imagem aqui

    O método antigo / manual:

    Para obter informações sobre como converter usando as bibliotecas gerenciadas :

    • Primeiro, aqui está uma ótima comparação de código de gerenciado versus não gerenciado : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
    • Certifique-se de ter baixado apenas a versão do ODP.NET, Managed Driver Xcopy
    • A partir do arquivo zip baixado, copie e cole no diretório do seu projeto:
      • Oracle.ManagedDataAccessDTC.dll
      • Oracle.ManagedDataAccess.dll
    • Adicione uma referência ao Oracle.ManagedDataAccess.dll
    • Verifique se o seu exe está liberado (adicionado à pasta de aplicativo no VS2010) com as duas DLLs

    Eu instalei apenas o Oracle Data Provider for .NET 2.0 (11.1.0.6.20) e não instalei o Oracle Instant Client (11.1.0.6.0) .

    Acabei de instalar e o erro desapareceu!

    Isso pode ser causado pela execução de um tempo de execução de 64 bits do .NET em um cliente Oracle de 32 bits. Isso pode acontecer se o seu servidor estiver executando o aplicativo em 64 bits. Ele executará o aplicativo .NET com o tempo de execução de 64 bits. Você pode definir o sinalizador da CPU em seu projeto no VS para executar no tempo de execução de 32 bits.

    Vamos fazer algum tipo de resumo:

    Mensagem de erro “O provedor não é compatível com a versão do cliente Oracle” pode ser causado por vários motivos.

    • Você não tem nenhum cliente Oracle instalado. Nesse caso, a mensagem de erro é de fato enganosa.

      ODP.NET (ou seja, arquivo Oracle.DataAccess.dll ) não está incluído no Oracle Instant Client, ele deve ser instalado separadamente (download do Oracle Data Access Components (ODAC) de 32 bits ou do Oracle Data Access Components (ODAC) de 64 bits Downloads ) ou você precisa selecionar a opção correspondente no Oracle Universal Installer (OUI).

    • A versão do ODP.NET não corresponde à versão instalada do Oracle Client. Você tem que verificar até mesmo o número da versão secundária! Por exemplo, o Oracle.DataAccess.dll versão 4.112.3.0 não é compatível com o Oracle Client 11.2.0.4 . Verifique as versões do ODP.NET e do Oracle Client cuidadosamente. Você pode usar sigcheck em oraociei*.dll e / ou OraOps*w.dll para obter a versão do Oracle Client.

      Esteja ciente do esquema de numeração diferente. A versão do arquivo 4.112.3.0 significa: .NET Framework Versão 4, Oracle Release 11.2.0.3.x.

      Existem versões do ODP.NET “1.x”, “2.x” e “4.x”. Esses números estão relacionados às versões do Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 e 4.0.30319. A versão “1.x” estava disponível até o Oracle Client 11.1. A versão “4.x” foi introduzida no Oracle Client 11.2

      Também esteja ciente de que Oracle.DataAccess.dll pode ser carregado do GAC, que por padrão tem precedência sobre qualquer arquivo fornecido localmente.

    • A arquitetura (32 bits ou 64 bits) do ODP.NET não corresponde à arquitetura do seu aplicativo. Um aplicativo de 32 bits funciona apenas com 32bit Oracle Client / ODP.NET, respectivamente, um aplicativo de 64 bits requer 64bit Oracle Client / ODP.NET. (A menos que você use o driver gerenciado ODP.NET )

    • A versão do .NET Framework não corresponde. Por exemplo, se você compilar seu aplicativo com o Target .NET Framework 2.0, não poderá usar o ODP.NET versão 4.x. A versão de destino do .NET Framework deve ser maior do que a versão do ODP.NET.

    Soluções

    • Considere usar o driver gerenciado do ODP.NET, ele pode ser baixado da página da Oracle: Downloads do Oracle Data Access Components (ODAC) de 64 bits . Lá você só precisa copiar o arquivo Oracle.ManagedDataAccess.dll para o seu diretório de aplicativos, nada mais é necessário. Funciona tanto para 32 bits quanto para 64 bits.

    • No seu *.csproj , resp. *.vbproj edite sua referência ao ODP.NET assim:

        False False  

      Atributos como Version=... ou processorArchitecture=... não são necessários. Seu aplicativo carregará o Oracle.DataAccess.dll correto, dependendo da arquitetura selecionada e da estrutura .NET de destino (desde que esteja instalado corretamente)

    • Eu não acho que é uma abordagem inteligente para tomar única DLL e copiá-los para determinadas pastas. Pode funcionar em uma máquina “nua”, mas se sua máquina de destino tiver instalado algum produto da Oracle, há um alto risco de incompatibilidade de versão. Desinstale qualquer produto Oracle da sua máquina e faça uma nova instalação. Dê uma olhada em Como desinstalar / remover completamente o Oracle 11g (cliente)? ordem para obter uma máquina realmente limpa.

    • Caso você tenha que trabalhar com aplicativos de 32 e 64 bits ao mesmo tempo, siga estas instruções para instalar as duas versões em uma máquina:

    Suposições: O Oracle Home é chamado OraClient11g_home1 , a versão do cliente é 11gR2.

    • Opcionalmente, remova qualquer cliente Oracle instalado

    • Baixe e instale o Oracle x86 Client, por exemplo, em C:\Oracle\11.2\Client_x86

    • Faça o download e instale o Oracle x64 Client em uma pasta diferente, por exemplo, para C:\Oracle\11.2\Client_x64

    • Abra a ferramenta de linha de comando, vá para a pasta% WINDIR% \ System32, normalmente C:\Windows\System32 e crie um link simbólico ora112 para a pasta C:\Oracle\11.2\Client_x64 (veja abaixo)

    • Mude para a pasta% WINDIR% \ SysWOW64, normalmente C:\Windows\SysWOW64 e crie um link simbólico ora112 para a pasta C:\Oracle\11.2\Client_x86 , (veja abaixo)

    • Modifique a variável de ambiente PATH , substitua todas as inputs como C:\Oracle\11.2\Client_x86 e C:\Oracle\11.2\Client_x64 por C:\Windows\System32\ora112 , respectiva subpasta \bin . Nota: C:\Windows\SysWOW64\ora112 não deve estar no ambiente PATH.

    • Se necessário, configure a variável de ambiente ORACLE_HOME para C:\Windows\System32\ora112

    • Abra o seu Editor do Registro. Defina o valor do Registro HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME para C:\Windows\System32\ora112

    • Defina o valor do Registro HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME para C:\Windows\System32\ora112 (não C:\Windows\SysWOW64\ora112 )

    • Você terminou! Agora você pode usar o cliente Oracle x86 e x64 integrado, ou seja, um aplicativo x86 carregará as bibliotecas x86, um aplicativo x64 carregará as bibliotecas x64 sem qualquer modificação adicional em seu sistema.

    Comandos para criar links simbólicos:

     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 

    Algumas notas:

    • Ambos os links simbólicos devem ter o mesmo nome, por exemplo, ora112 .

    • Caso deseje instalar o ODP.NET manualmente depois, tenha o cuidado de selecionar pastas apropriadas para instalação.

    • Apesar de seus nomes, a pasta C:\Windows\System32 contém as bibliotecas x64, enquanto C:\Windows\SysWOW64 contém as bibliotecas x86 (32 bits). Não fique confuso.

    • Talvez seja uma opção sábia para definir sua variável de ambiente TNS_ADMIN (resp. Entradas TNS_ADMIN no Registro) para um local comum, por exemplo, TNS_ADMIN=C:\Oracle\Common\network .

    Para o Oracle 11g (11.1.0.7.20) eu tive que adicionar as seguintes dlls junto com o meu Exe para o trabalho.

    1. oci.dll
    2. OraOps11w.dll
    3. oraociicus11.dll (muito grande perto de 30mb)
    4. Oracle.DataAccess.dll

    instalar ODP.Net na máquina de destino e deve resolver o problema … copiando a dll não parece uma boa idéia …

    Depois de desperdiçar três horas com isso, meu problema era simplesmente:

    Missing OraOps11w.dll

    Por que isso deve gerar “O provedor não é compatível com a versão do cliente Oracle” mensagem de erro? Deve ser um código / teste ruim da Oracle. Eu usei Oracle desde 1994 e muitas vezes com .Net desde 2002. É praticamente sempre uma dor.

    Todos devem desinstalar o Oracle e seguir a solução de Chris acima (resposta principal) . Isso deve funcionar sempre

    De outro post no StackOverflow, é como desinstalar o Oracle (esqueça a ferramenta de desinstalação do Oracle, pois ela não funciona corretamente):

    • Desinstale todos os componentes do Oracle usando o Oracle Universal Installer (OUI).
    • Execute o regedit.exe e exclua a chave HKEY_LOCAL_MACHINE / SOFTWARE / ORACLE. Isso contém registros para todos os produtos Oracle.
    • Exclua todas as referências a serviços Oracle deixados para trás na seguinte parte do registro: HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / Ora * Deve ficar bastante óbvio quais estão relacionadas ao Oracle.
    • Reinicie sua máquina.
    • Exclua o diretório “C: \ Oracle” ou qualquer diretório que seja seu ORACLE_BASE.
    • Exclua o diretório “C: \ Program Files \ Oracle”.
    • Esvazie o conteúdo do seu diretório “c: \ temp”.
    • Esvazie sua lixeira.

    Chris tem menos dlls do que eu no Server 2003 (32 bits). Isso é o que eu tenho:

     C:\oracle\instantclient>dir /b oci.dll ociw32.dll Oracle.DataAccess.dll orannzsbb11.dll oraocci11.dll oraociei11.dll OraOps11w.dll Orasqlplusic11.dll sqlplus.exe tnsnames.ora 

    C: \ oracle \ instantclient está no caminho global e na variável de ambiente ORACLE_HOME. Referências de código .net C: \ oracle \ instantclient \ Oracle.DataAccess.dll

    Após várias horas de solução de problemas, descobri que esse problema foi causado por ter Oracle.DataAccess.dll (v4.0) no meu diretório bin projetos, mas o runtime também carregando Oracle.DataAccess.dll (v2.x) do GAC. Remover e ler a input Oracle.DataAccess nas referências do projeto resolveu o problema para mim.

    Os outros arquivos mencionados aqui não parecem ser necessários na minha situação.

    ATUALIZAR

    A causa raiz do erro “O provedor não é compatível com a versão do cliente Oracle” é (geralmente) que o assembly gerenciado está tentando carregar bibliotecas não gerenciadas que não correspondem às versões. Parece que você pode forçar o driver Oracle para usar as bibliotecas corretas, especificando o caminho da biblioteca no web.config 1

             

    Parece-me que, embora você tenha ODP com o Oracle Istant Client, o ODP pode estar tentando usar o Oracle Client real. Você tem um cliente Oracle padrão instalado na máquina também? Eu me lembro de o Oracle ser bastante exigente quanto a vários clientes na mesma máquina.

    Eu tive o mesmo problema. Eu apaguei (e esqueci que eu tinha apagado) oraociei11.dll depois de compilar o aplicativo. E foi dando esse erro ao tentar executar. Então, quando ele não pode encontrar a dll que oraociei11.dll, ele mostra esse erro. Pode haver outros casos em que esse erro ocorre, mas esse parece ser um deles.

    Procure também o pool de aplicativos IIS Habilite o flag true ou false de 32 bits, quando você vir esta mensagem, algum fórum oracle me orientou sobre isso!

    Aqui está o que eu fiz para resolver este problema que persistiu por 3 longas horas:

    1. Na home do Oracle localizada em C:\oracle\product\11.2.0 eu tinha uma pasta chamada client_1 onde eu havia instalado anteriormente os bits do ODP.NET para o Windows 64 bits.

    2. Posteriormente, ao tentar depurar meu aplicativo ASP.NET Web API com o Visual Studio 2012, continuei recebendo esta mensagem de erro: O provedor não é compatível com a versão do cliente Oracle .

    3. Pesquisando no Google, descobri que isso estava acontecendo porque eu estava usando o ODP.NET 64 bits. Então peguei o ODP.NET para Windows 32 bits e instalei, mas continuei recebendo a mesma mensagem de erro.

    4. SOLUÇÃO: apagou a pasta client_1 e reinstalou o ODP.NET 32 bits. O instalador estava misturando bits da versão de 64 bits com a versão de 32 bits. Vai saber…

    5. Agora estou feliz de novo e posso abrir um novo OracleConnection . FINALMENTE! 🙂

    Para quem ainda tem esse problema: com base neste artigo

    http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html

    Descobri que meu servidor estava faltando a biblioteca de tempo de execução do Microsoft C ++ Visual – eu tinha na minha máquina dev por causa do Visual Studio instalado. Eu baixei e instalei a versão (atualmente) mais recente da biblioteca aqui:

    http://www.microsoft.com/en-us/download/details.aspx?id=13523

    Ran a configuração e a chamada oracle de C # fez isso!

    Versão TLDR:

    • Use o provedor gerenciado 100% 100c .
    • Se você precisar usar o provedor antigo, precisará apontar o arquivo Oracle.DataAccess.dll para as DLLs do Oracle Client não gerenciadas que são da versão correta. Se você tem vários Oracle Clients instalados em sua máquina que podem ser simples, como include a variável de configuração “DllPath” (veja abaixo) em sua configuração de aplicativo, mas você também pode precisar instalar um novo cliente oracle para apontar para.

    Versão completa:

    Primeiro, vamos nos certificar de que entendemos os componentes do antigo provedor não vinculado (não o novo provedor gerenciado de 100%). É composto de duas partes:

    1. o componente .net gerenciado – Oracle.DataAccess.dll
    2. o cliente não gerenciado (non.net)

    Simplesmente falando, Oracle.DataAccess.dll é quase apenas um invólucro, traduzindo as instruções .net em instruções ORACLE-NET para o cliente não gerenciado.

    Dito isso, quando você carrega o Oracle.DataAccess, há uma ordem na qual ele tenta localizar as dlls do cliente não gerenciado de que precisa. Da documentação do Oracle :

    O Oracle.DataAccess.dll procura por DLLs não gerenciadas dependentes (como o Oracle Client) com base na seguinte ordem:

    1.Diretório da aplicação ou executável.

    Configuração de 2.DllPath especificada pela configuração do aplicativo ou web.config.

    Configuração de 3.DllPath especificada por machine.config.

    Configuração 4.DllPath especificada pelo Registro do Windows.

    HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ versão \ DllPath

    5.Diretórios especificados pela variável de ambiente PATH do Windows.

    Portanto, no seu caso, seu aplicativo seguiu esse processo acima e encontrou um caminho com dlls não gerenciadas que são muito antigas em relação ao assembly Oracle.DataAccess.dll que você está usando.

    Pode ser que o único cliente Oracle instalado nessa máquina seja muito antigo. Mas isso entra em jogo se você tiver mais de um cliente instalado na máquina e os arquivos não gerenciados forem encontrados primeiro em uma instalação diferente, porém mais antiga. Se o mais tardar, o simples a fazer é usar a variável de configuração dllPath em sua configuração e apontá-la na pasta correta do Oracle Home Bin:

          

    Se você deseja instalar uma nova cópia do cliente, a versão do xcopy é a menor e contém o “cliente instantâneo” e aponta o DllPath acima para esse novo local. Mas qualquer instalação de cliente oracle irá funcionar.

    Mas se você quiser evitar todo esse problema de resolução de clientes não gerenciados, veja se você pode atualizar seu aplicativo para usar o provedor 100% gerenciado – é apenas um ou dois conjuntos gerenciados, sem nenhuma dependência de arquivos não gerenciados.

    Também é possível que você não esteja carregando o Oracle.DataAccess.dll que você acredita estar instalado em seu diretório bin e em seu GAC, mas acho que esse é o menos provável senario. Veja o processo de resolução de assembly para mais informações.

    O usuário do IIS / IWAM tem permissions no diretório do Oracle? Você pode se conectar a essa fonte de dados usando outro aplicativo, como o Excel ou o Access?

    Nós tivemos o mesmo problema, porque o assembly Oracle.Data.dll em um compartilhamento de rede foi atualizado por nossos DBAs. Remover a referência do projeto e adicioná-la novamente resolveu o problema.

    Eu tenho o mesmo problema, mas no meu caso eu não posso simplesmente copiar as dlls para a pasta bin, então eu só ‘religar’ a versão do assembly.

                

    Apenas dois passos para resolver este problema.

    1. vá para avançar a configuração do pool de aplicativos e defina o sinalizador ‘Habilitar Aplicativo de 32 bits’ para Verdadeiro.
    2. Certifique-se de todas as Dlls no seu Bin é a versão de 32 bits agora …

    boa sorte.

    Eu não desci a estrada de obter novas DLLs. Nós tínhamos um monte de projetos existentes que funcionam perfeitamente bem e foi apenas o meu novo projeto que estava me dando dor de cabeça, então decidi tentar outra coisa.

    Meu projeto estava usando um Internal.dll desenvolvido internamente que dependia de v4.112.3.0 . Por algum motivo, ao publicar, o Visual Studio sempre v4.121.0.0 , mesmo que não fosse explicitamente especificado em nenhum dos arquivos de configuração. É por isso que eu estava recebendo um erro.

    Então o que eu fiz foi:

    1. Copiado Internal.dll de um dos projetos em execução com êxito para o meu site /bin (apenas para estar no lado seguro).
    2. Copiado Oracle.DataAccess.dll de um dos projetos em execução com êxito para o site /bin meu site.
    3. Adicionar referência a ambos do meu site.
    4. Finalmente, a referência myWebSite.csproj apareceu em myWebSite.csproj , mas mostrou a versão errada: v4.121.0.0 vez de v4.112.3.0 .
    5. Eu alterei manualmente a referência em myWebSite.csproj , então agora ele lê:

        False bin\Oracle.DataAccess.dll  

    Eu encontrei esse problema depois de instalar o Oracle Data Tools para Visual Studio 2015 e, em seguida, lutar com o Oracle por uma boa hora. Decidi tentar reinstalar o cliente Oracle novamente em vez desta confusão com cópia de arquivos, alterações de configuração, etc., e isso funcionou para mim.

    Recentemente eu tive que trabalhar em um projeto mais antigo, onde a solução e todos os projetos contidos foram direcionados para a plataforma x32. Eu continuei tentando copiar o Oracle.DataAccess.dll e todos os outros arquivos sugeridos do Oracle em todos os lugares, mas acertar a parede toda vez. Finalmente a lâmpada na cabeça acendeu (depois de 8 horas :)), e pediu para verificar os assemblies ODAC instalados e sua plataforma. Eu tinha todos os clientes ODAC de 64 bits (x64) já instalados, mas não os de 32 bits (x32). Instalado o ODAC de 32 bits e o problema desapareceu.

    Como verificar a versão do ODAC instalado: Procure na pasta C: \ Windows \ assembly. A propriedade “Processor Architecture” informará a plataforma do ODAC instalado.

    Oito horas é muito tempo para a lâmpada acender. Não admira que eu sempre tenha que trabalhar duro :).

    A solução de Chris também funcionou para mim. No entanto, recebi uma mensagem de erro que diz:

     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. 

    Aparentemente, na língua estrangeira do Oraclish, isso significa que seu programa está segmentando todas as plataformas ou máquinas de 32 bits. Basta alterar sua plataforma de destino nas propriedades do projeto para 64 bits e esperar pelo melhor.

    Eu tive o mesmo problema com o Oracle.DataAccess.dll v4.121.2.0. com instalação de 2 casas (versões de 32 e 64 bits). Versão de 32 bits workerd, versão de 64 bits não.

    No meu caso (após 2 dias de tentativas) descobri que o problema era permissions na versão home de 64 bits. Muitos Diretórios dessa versão tinham permissions substituídas exclusivamente, em que a function “Usuários Autenticados” não tinha access “Leitura”, que é definido por padrão no diretório pai. Esses subdiretórios incluíam “bin”, “network / admin”, “nls”, “oracore”, “RDBMS” e possivelmente outros. Eu os encontrei filtrando o resultado “ACCESS DENIED” no utilitário “Process Monitor” (Procmon.exe) da sysinternals. Depois que as permissions foram herdadas do diretório pai para esses subdiretórios filhos, tudo começou a funcionar.

    Eu não fiz o que para replace as permissions em todo o oracle home, então eu fiz um diretório de cada vez, mas eu acho que se você não se preocupar com a segurança tanto você pode redefini-lo em todo o diretório home oracle correspondente.

    • Em uma máquina de 64 bits, copie “msvcr71.dll” de C: \ Windows \ SysWOW64 para o diretório bin do seu aplicativo.
    • Em uma máquina de 32 bits, copie “msvcr71.dll” de C: \ Windows \ System32 para o diretório bin do seu aplicativo.

    http://randomdevtips.blogspot.com/2012/06/provider-is-not-compatible-with-version.html

    Muitas respostas teóricas aqui, mas aqui vem um exemplo de trabalho com código que você pode copiar e colar e testar imediatamente:

    1. Instalei o database Oracle Express OracleXE112, que já vem com algumas tabelas de demonstração pré-instaladas.
    2. Quando você inicia o instalador, é solicitada uma senha . Eu digitei “xxx” como senha. (não usado na produção)
    3. Meu servidor é executado na máquina 192.168.1.158
    4. No servidor, você deve permitir explicitamente o access ao processo TNSLSNR.exe no Firewall do Windows. Esse processo escuta na porta 1521. Se você receber um erro de tempo limite do código abaixo, verifique seu firewall.
    5. OPÇÃO A: Para C # (.NET2 ou .NET4) você pode baixar o ODAC11 , a partir do qual você precisa adicionar o Oracle.DataAccess.dll ao seu projeto. Esta DLL depende ainda: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. Essas DLLs devem estar no mesmo diretório que o EXE ou você deve especificar o caminho da DLL em: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath . Em máquinas de 64 bits, escreva adicionalmente para HKLM\SOFTWARE\Wow6432Node\Oracle\...
    6. OPÇÃO B: Se você tiver baixado ODAC12 você precisa Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), Oraons.dll, msvcr100.dll. O caminho do Registro é HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
    7. OPÇÃO C: Se você não quiser grandes DLLs de mais de 100 MB você deve baixar ODP.NET_Managed12.xxxxxxxx.zip no qual você encontra o Oracle.ManagedDataAccess.dll que tem apenas 4 MB e é uma DLL gerenciada pura que funciona em 32 Processos bit e 64 bit também e não dependem de nenhuma outra DLL e não requerem nenhuma input de registro.
    8. O seguinte código C # funciona para mim sem qualquer configuração no lado do servidor (apenas a instalação padrão):
     usando Oracle.DataAccess.Client;
     ou
     usando Oracle.ManagedDataAccess.Client;
    
     ....
    
     string oradb = "Fonte de Dados = (DESCRIPTION ="
         + "(ADDRESS_LIST = (ENDEREÇO ​​= (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
         + "(CONNECT_DATA = (SERVIDOR = DEDICADO)));"
         + "User Id = SYSTEM; Password = xxx;";
    
     usando (OracleConnection conn = new OracleConnection (oradb)) 
     {
         conn.Open ();
         usando (OracleCommand cmd = new OracleCommand ())
         {
             cmd.Connection = conn;
             cmd.CommandText = "selecione TABLESPACE_NAME de DBA_DATA_FILES";
    
             usando (OracleDataReader dr = cmd.ExecuteReader ())
             {
                 while (dr.Read ())
                 {
                     listBox.Items.Add (dr ["TABLESPACE_NAME"]));
                 }
             }
         }
     }