Estou tentando usar o cliente instantâneo Oracle ODP.NET 11g (11.1.0.6.20) no meu projeto ASP.net como provedor de dados, mas quando executo a página aspx, recebo a mensagem " O provedor não é compatível com a versão do cliente Oracle "mensagem de erro. Qualquer ajuda seria apreciada.
Mencionei o Data Provider no Visual Studio 2005 e o código por trás é assim:
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 a este:
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
Você deve "ignorar" todas as conversas x86 / x64 aqui para iniciantes e, em vez disso, tente o driver gerenciado ODP.NET (se estiver usando o .Net v4 +):
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
Driver gerenciado versus não gerenciado do Oracle ODP.net
Evite todos os "não gerenciados" que DLL que problemas de arquitetura! : D (sobre o tempo Oracle).
O pacote NuGet (também funciona para 11g):
O método antigo / manual:
Para obter informações sobre como converter para usar as bibliotecas gerenciadas :
fonte
readme
que descreve algumas limitações.Instalei apenas o Oracle Data Provider para .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!
fonte
Isso pode ser causado pela execução de um tempo de execução .NET de 64 bits em um cliente Oracle de 32 bits. Isso pode acontecer se o servidor em que você estiver executando o aplicativo for de 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.
fonte
Vamos fazer algum tipo de resumo:
A mensagem de erro "O provedor não é compatível com a versão do cliente Oracle" pode ser causada por vários motivos.
Você não possui um Oracle Client instalado. Nesse caso, a mensagem de erro é realmente enganosa.
Oracle Data Provider para .NET (ODP.NET, ou seja, arquivo
Oracle.DataAccess.dll
) não está incluído no Oracle Instant cliente, tem que ser instalado separadamente (download de 32 bits Oracle Data Access Components (ODAC) ou 64-bit Oracle Data Access Components ( ODAC) ) ou você deve selecionar a opção de acordo no Oracle Universal Installer (OUI).Observe que, ao instalar o Oracle Data Provider> = 12.1, o provedor não é registrado automaticamente no GAC. Você deve registrá-lo manualmente, se necessário, consulte Oracle Doc 2272241.1 .
A versão do ODP.NET não corresponde à versão instalada do Oracle Client. Você precisa verificar até o número da versão secundária! Por exemplo, a
Oracle.DataAccess.dll
versão 4.112.3.0 não é compatível com o Oracle Client 11.2.0.4 . Verifique cuidadosamente as versões do ODP.NET e do Oracle Client. Você pode usar SigCheck onoraociei*.dll
e / ouOraOps*w.dll
para obter versão do Oracle Client.Esteja ciente de um esquema de numeração diferente. Versão do arquivo 4.112.3.0 meios: .NET Framework versão 4, a Oracle lançamento 11.2.0.3.x .
Existem versões ODP.NET "1.x", "2.x" e "4.x". Esses números estão relacionados às versões 1.0.3705 / 1.1.4322, 2.0.50727 e 4.0.30319 do Microsoft .NET Framework. A versão "1.x" estava disponível até o Oracle Client 11.1. A versão "4.x" foi introduzida com o Oracle Client 11.2
A arquitetura (32 bits ou 64 bits) do ODP.NET não corresponde à arquitetura do aplicativo. Um aplicativo de 32 bits funciona apenas com o Oracle Client / ODP.NET de 32 bits, respectivamente; um aplicativo de 64 bits requer o Oracle Client / ODP.NET de 64 bits. (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 igual ou superior à versão do ODP.NET.
A versão da
Oracle.DataAccess.dll
sua máquina de desenvolvimento (ou seja, a versão carregada durante a compilação) é maior que a versão na máquina de destino.Esteja ciente de que
Oracle.DataAccess.dll
pode ser carregado no GAC, que por padrão tem precedência sobre qualquer arquivo fornecido localmente.Soluções
Considere usar o driver gerenciado ODP.NET, ele pode ser baixado da página Oracle: Downloads de Oracle Data Access Components (ODAC) de 64 bits . Lá você só precisa copiar o
Oracle.ManagedDataAccess.dll
arquivo para o diretório do aplicativo, nada mais é necessário. Funciona para 32 bits e 64 bits.No seu
*.csproj
, resp.*.vbproj
edite sua referência ao ODP.NET assim:Atributos como
Version=...
ouprocessorArchitecture=...
não são obrigatórios.Seu aplicativo carregará o correto,-> não 100% verificadoOracle.DataAccess.dll
dependendo da arquitetura selecionada e da estrutura .NET de destino (desde que esteja instalado corretamente)Caso você não conheça a versão do Oracle Client na máquina de destino (por exemplo, pode ser a máquina do seu cliente): Vá para a página de download mencionada acima e faça o download da versão menos XCopy do Oracle Data Access Components. Extraia o zip e copie apenas o
Oracle.DataAccess.dll
arquivo para sua máquina local. No seu projeto do VS, faça uma referência a essa DLL (provavelmente desatualizada). A versão desta DLL é a menor versão do ODP.NET com a qual seu aplicativo funcionará. Quando você executa o aplicativo, a Política do Publicador no GAC será redirecionada para a versão realmente instalada.Eu não acho que seja uma abordagem inteligente pegar DLLs únicas e copiá-las para determinadas pastas. Pode funcionar em uma máquina "despida", mas se a máquina de destino tiver instalado produtos 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)? para obter uma máquina realmente limpa.
Caso você precise trabalhar com aplicativos de 32 bits e 64 bits ao mesmo tempo, siga estas instruções para instalar as duas versões em uma máquina:
Pressupostos: o Oracle Home é chamado
OraClient11g_home1
, a Versão do Cliente é 11gR2.Como opção, remova qualquer cliente Oracle instalado
Faça o download 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ólicoora112
para a pastaC:\Oracle\11.2\Client_x64
(veja abaixo)Altere para a pasta% WINDIR% \ SysWOW64, normalmente
C:\Windows\SysWOW64
e crie um link simbólicoora112
para a pastaC:\Oracle\11.2\Client_x86
(veja abaixo)Modifique a
PATH
variável de ambiente, substitua todas as entradas comoC:\Oracle\11.2\Client_x86
eC:\Oracle\11.2\Client_x64
porC:\Windows\System32\ora112
, respectivas\bin
subpastas. Nota:C:\Windows\SysWOW64\ora112
não deve estar no ambiente PATH.Se necessário, defina sua
ORACLE_HOME
variável de ambiente comoC:\Windows\System32\ora112
Abra o seu Editor do Registro. Defina o valor do Registro
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
comoC:\Windows\System32\ora112
Defina o valor do Registro
HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
comoC:\Windows\System32\ora112
(nãoC:\Windows\SysWOW64\ora112
)Você terminou! Agora você pode usar o cliente Oracle x86 e x64 juntos, ou seja, um aplicativo x86 carrega as bibliotecas x86, um aplicativo x64 carrega as bibliotecas x64 sem nenhuma modificação adicional no seu sistema.
Comandos para criar links simbólicos:
Algumas notas:
Ambos os links simbólicos devem ter o mesmo nome, por exemplo
ora112
.Caso deseje instalar o ODP.NET manualmente posteriormente, selecione as pastas apropriadas para instalação.
Apesar de seus nomes, a pasta
C:\Windows\System32
contém as bibliotecas x64, enquanto as bibliotecasC:\Windows\SysWOW64
x86 (32 bits). Não fique confuso.Talvez seja uma opção sensata definir sua
TNS_ADMIN
variável de ambiente (resp.TNS_ADMIN
Entradas no Registro) para um local comum, por exemploTNS_ADMIN=C:\Oracle\Common\network
.fonte
Oracle.DataAccess.dll
partir do pacote nugetOracle.DataAccess.x86
e sua versão Dll é2.112.1.0
, portanto , eu instalei o Oracle Client com a versãoOracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64)
AQUI e resolvi o problema!Após várias horas de solução de problemas, esse problema foi causado por ter o Oracle.DataAccess.dll (v4.0) no diretório bin do meu projeto, mas o tempo de execução também carregava o Oracle.DataAccess.dll (v2.x) do GAC. Remover e ler a entrada 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 a versões. Parece que você pode forçar o driver Oracle a usar as bibliotecas corretas, especificando o caminho da biblioteca no web.config 1
fonte
instale o ODP.Net na máquina de destino e deve resolver o problema ... copiar as dlls não parece uma boa ideia ...
fonte
Para o Oracle 11g (11.1.0.7.20), tive que adicionar as seguintes DLLs, juntamente com o meu Exe, para funcionar.
fonte
Parece-me que, embora você tenha ODP com o Oracle Istant Client, o ODP pode estar tentando usar o Oracle Client real. Você também tem um cliente Oracle padrão instalado na máquina? Lembro-me da Oracle ser bastante exigente quando se tratava de vários clientes na mesma máquina.
fonte
Eu tive o mesmo problema. Excluí (e esqueci que havia excluído) oraociei11.dll após compilar o aplicativo. E estava 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.
fonte
Procure também o pool de aplicativos IIS Ative o sinalizador verdadeiro ou falso de 32 bits. Quando você vê esta mensagem, algum fórum da Oracle me indicou isso!
fonte
Eu tenho o mesmo problema, mas no meu caso, não posso simplesmente copiar as DLLs para a pasta bin e, em seguida, apenas 'religo' a versão do assembly.
fonte
Aqui está o que eu fiz para resolver esse problema que persistiu por 3 longas horas:
Sob o Oracle home localizado em,
C:\oracle\product\11.2.0
eu tinha uma pasta chamadaclient_1
onde eu havia instaladoODP.NET
bits anteriormente para o Windows 64 bits.Mais tarde, ao tentar depurar meu aplicativo de API da Web do ASP.NET com o Visual Studio 2012, recebi a seguinte mensagem de erro: O provedor não é compatível com a versão do cliente Oracle .
Pesquisando no Google, descobri que isso estava acontecendo porque eu estava usando
ODP.NET
64 bits. Então peguei oODP.NET
Windows 32 bits e o instalei, mas continuava recebendo a mesma mensagem de erro.SOLUÇÃO: excluiu a pasta
client_1
e reinstalouODP.NET
32 bits. De certa forma, o instalador estava misturando bits da versão de 64 bits com a versão de 32 bits. Vai saber...Agora estou feliz novamente e posso abrir um novo
OracleConnection
. FINALMENTE! :)fonte
Para quem ainda está com esse problema: com base neste artigo
http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html
Descobri que meu servidor estava com falta da Microsoft C ++ Visual Runtime Library - eu o tinha na minha máquina de desenvolvimento 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
Executou a instalação e a chamada do oracle a partir do C # chegou!
fonte
Versão TLDR:
Versão completa:
Primeiro, certifique-se de entender os componentes do antigo provedor não gerenciado (não o novo provedor gerenciado 12c 100%). É composto de duas peças:
Simplificando, o Oracle.DataAccess.dll é quase apenas um invólucro, traduzindo instruções .net em instruções ORACLE-NET para o cliente não gerenciado.
Dito isto, quando você carrega o Oracle.DataAccess, há uma ordem na qual ele tenta localizar as dlls do cliente não gerenciado necessárias. Na documentação do Oracle :
Portanto, no seu caso, seu aplicativo seguiu esse processo acima e encontrou um caminho que possui dlls não alteradas muito antigas em relação ao assembly Oracle.DataAccess.dll que você está usando.
Pode ser que a única instalação do Oracle Client nessa máquina seja muito antiga. Mas isso entra em jogo se você tiver mais de um cliente instalado na máquina e os arquivos não gerenciados foram encontrados primeiro em uma instalação diferente, mas mais antiga. Se posteriormente, a coisa mais simples a fazer é usar a variável de configuração dllPath na sua configuração e apontá-la para a pasta correta do Oracle Home Bin:
Se você deseja instalar uma cópia nova do cliente, a versão do xcopy é a menor e contém o "cliente instantâneo" e aponte o DllPath acima para esse novo local. Mas qualquer instalação do cliente oracle funcionará.
Mas se você deseja evitar todo esse material de resolução de cliente não gerenciado, verifique se é possível atualizar seu aplicativo para usar o provedor gerenciado 100% - na verdade, são apenas um ou dois assemblies gerenciados, sem nenhuma dependência de arquivos não-geridos.
Também é possível que você não esteja carregando o Oracle.DataAccess.dll que você pensa que está instalado no diretório bin e no GAC, mas acho que esse é o senario menos provável. Consulte o processo de resolução da montagem para obter mais informações.
fonte
O usuário do IIS / IWAM tem permissões no diretório Oracle? Você pode se conectar a essa fonte de dados usando outro aplicativo, como Excel ou Access?
fonte
Tivemos o mesmo problema, porque o assembly Oracle.Data.dll em um compartilhamento de rede foi atualizado pelos nossos DBAs. Remover a referência do projeto e adicioná-lo novamente resolveu o problema.
fonte
Apenas duas etapas para resolver esse problema.
boa sorte.
fonte
Eu não segui o caminho de obter novas DLLs. Tínhamos vários projetos existentes que funcionam perfeitamente bem e era 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 do Oracle.DataAccess.dll
v4.112.3.0
. Por alguma razão, ao publicar, o Visual Studio sempre carregavav4.121.0.0
, mesmo que não estivesse especificado explicitamente em nenhum dos arquivos de configuração. É por isso que eu estava recebendo um erro.Então o que eu fiz foi:
/bin
(apenas por segurança)./bin
.myWebSite.csproj
, mas mostrou a versão errada: emv4.121.0.0
vez dev4.112.3.0
.Alterei manualmente a referência
myWebSite.csproj
para, agora ela lê:fonte
bin
eobj
são pastas de saída ; é aqui que as DLLs vão quando você cria seu projeto. Você deve poder excluir essas pastas a qualquer momento sem criar conflito. Geralmente essas pastas são ignoradas no controle de origem. A prática padrão é criar umaExternal References
pasta onde você coloca suas dlls referenciadas.HintPath
completamente.Encontrei esse problema depois de instalar o Oracle Data Tools para Visual Studio 2015 e depois brigar com o Oracle por uma boa hora. Decidi tentar reinstalar o cliente Oracle novamente em vez dessa bagunça com a cópia de arquivos, alterações de configuração etc., e isso funcionou para mim.
fonte
Eu enfrentei um problema semelhante e a causa principal era que o GAC tinha duas versões oracle.dataaccess, ou seja, v4.0_4.112.2.0 e v4.0_4.112.4.0. Meu aplicativo se referia à v4.0_4.112.2.0; portanto, quando removi a v4.0_4.112.4.0 do GAC, funcionou bem.
Caminho do GAC: C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess
Antes :
Depois de :
Para remover uma versão, basta excluir a pasta correspondente do GAC.
fonte
Recentemente, tive que trabalhar em um projeto mais antigo, em que a solução e todos os projetos contidos eram direcionados à plataforma x32. Continuei tentando copiar o Oracle.DataAccess.dll e todos os outros arquivos Oracle sugeridos em todos os lugares, mas sempre batia na parede. Finalmente, a lâmpada na cabeça acendeu (após 8 horas :)) e pediu para verificar os conjuntos ODAC instalados e sua plataforma. Eu já tinha todos os clientes ODAC de 64 bits (x64) instalados, mas não os de 32 bits (x32). Instalou 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 é de admirar que eu sempre tenha que trabalhar no trabalho :).
fonte
C:\Windows\assemblies
apenas mostra os assemblies até o .NET framework versão 2.0. A versão 3.x / 4.x não é exibida, consulte stackoverflow.com/questions/28213105/…A solução de Chris também funcionou para mim. No entanto, recebi uma mensagem de erro a seguir que afirma:
Aparentemente, no idioma estrangeiro do Oraclish, isso significa que seu programa está direcionado a todas as plataformas ou máquinas de 32 bits. Basta alterar sua plataforma de destino nas Propriedades do projeto para 64 bits e esperar o melhor.
fonte
Eu tive o mesmo problema com o Oracle.DataAccess.dll v4.121.2.0. com instalação de 2 residências (versões de 32 e 64 bits). Versão de 32 bits, versão de 64 bits não.
No meu caso (após 2 dias de tentativas), descobri que o problema era de permissões na versão doméstica de 64 bits. Muitos diretórios nessa versão tinham permissões sobrescritas exclusivamente em que a função "Usuários autenticados" não tinha acesso "Leitura", definido por padrão no diretório pai. Esses subdiretórios incluem "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 permissões foram herdadas do diretório pai para os subdiretórios filhos, tudo começou a funcionar.
Eu não fiz o que sobrescrever as permissões em todo o oracle home, por isso fiz um diretório por vez, mas acho que se você não se preocupa tanto com segurança, pode redefini-lo em todo o diretório home do oracle correspondente.
fonte
http://randomdevtips.blogspot.com/2012/06/provider-is-not-compatible-with-version.html
fonte
Muitas respostas teóricas aqui, mas aqui vem um exemplo de trabalho com código que você pode copiar, colar e testar imediatamente:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
. Em máquinas de 64 bits, escreva adicionalmente paraHKLM\SOFTWARE\Wow6432Node\Oracle\...
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
Oracle.ManagedDataAccess.dll
apenas 4 MB e é uma DLL gerenciada pura que funciona em processos de 32 e 64 bits também e depende de nenhuma outra DLL e não requer nenhuma entrada do registro.fonte
Oracle.DataAccess.dll
comando programa carrega no total 35 DLLs do Oracle! Melhor fazer uma instalação normal do Oracle Client - a menos que você use o driver gerenciado ODP.NET, é claro.oracle.key
). Para compatibilidade, você também deve levar em consideração as versões menores.Oracle.DataAccess, Version=2.112.2.0
não funciona com aOraOps11w.dll
versão 2.112.4.0, por exemplo.