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

157

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

Respostas:

91

Eu estive analisando esse 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 disso:

  • Baixar ODP.Net
  • Descompacte o arquivo
  • Descompacte todos os JARs nele
  • Pegue estas DLLs que foram descompactadas:
    • oci.dll (renomeado como 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (renomeado como 'ociw32.dll.dbl')
  • Coloque todas as DLLs na mesma pasta que seu executável em C #
Chris
fonte
4
Sua solução funcionou para mim - encontrei seu post antes que eu o encontrasse. Você é o cara. Obrigado! :-) Além disso, usando a versão mais recente do ODAC, não precisei descompactar nenhum dos JARs ... os arquivos .dll estavam localizados em vários diretórios na minha página inicial do oracle. Uma simples pesquisa no Windows os transformou muito rapidamente.
Pandincus
10
Além disso, eu estava usando a versão mais recente do ODAC (11.2.0.1.2) na minha máquina de desenvolvimento e os únicos arquivos necessários eram: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Como Chris aponta, VERIFIQUE SE ESTÃO NA MESMA PASTA COMO EXECUTÁVEL. ;-)
Pandincus
1
Parece que a versão mais recente facilita encontrar as DLLs. Ótimo! Agora quanto tempo até rolos oracle-los em uma dll simples ...
Chris
A estratégia de Chris e o conjunto de bibliotecas de Pandincus funcionaram para mim. Estou ligando para o cliente oracle através do PowerShell, então coloquei a biblioteca definida no diretório executável do PowerShell.
quillbreaker
1
Você provavelmente deve usar o # conseguiu motorista C estes dias se você pode :)
Chris
47

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

insira a descrição da imagem aqui

O método antigo / manual:

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

  • Primeiro, aqui está uma excelente comparação de código de gerenciado versus não gerenciado : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Verifique se você baixou apenas a versão ODP.NET, Managed Driver Xcopy
  • No arquivo zip baixado, copie e cole no diretório do projeto:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Adicione uma referência ao Oracle.ManagedDataAccess.dll
  • Certifique-se de que seu exe seja lançado (adicionado à pasta de aplicativos no VS2010) com as duas DLLs
Tod Thomson
fonte
3
É uma boa notícia que a Oracle finalmente tenha um driver totalmente gerenciado. Carregar essa dll de 100mb tem sido um fardo real.
Jafin
1
o motorista conseguiu funciona muito bem para mim - eu tive nenhum problema desde que se deslocam sobre a ele / você pode definir os seus projectos de volta para AnyCPU etc e ele funciona muito bem :)
Tod Thomson
5
Para que todos saibam, enquanto o provedor gerenciado é bom, faltam muitos recursos permitidos pelo provedor completo. A saber, a criptografia incorporada da Oracle.
Justin Skiles 28/03
1
A documentação da Oracle tende a ser "dispersa" para dizer o mínimo. Aqui está um bom link para alguns métodos não suportados . Além disso, o próprio driver vem com um readmeque descreve algumas limitações.
perfil completo de Justin Skiles
2
O uso do driver gerenciado é a solução final! eu tenho uma vez de nitghtmare eu acho que todo o tempo gasto quando eu tinha uma incompatibilidade de tipo
ettore ct
35

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!

EverTheLearner
fonte
3
Você pode simplesmente copiar as 4 DLLs do cliente instantâneo na mesma pasta que o seu EXE, em vez de instalar o cliente? (esses arquivos: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris
2
@ Chris: Sim, você pode. Na minha experiência, no entanto, você precisa de oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll e oracle.dataaccess.dll
#
Ao contrário para mim - eu tinha instalado o cliente, mas não o provedor
Ev.
33

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.

Daniel
fonte
Apenas encontrei este. Trabalhou em um aplicativo de teste (32 bits) e caiu no IIS. Em vez de exigir que todos os assemblies envolvidos sejam de 32 bits, mudei para um AppPool de 32 bits.
anton.burger
22

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.dllversã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 on oraociei*.dlle / ou OraOps*w.dllpara 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.dllsua 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.dllpode 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.dllarquivo para o diretório do aplicativo, nada mais é necessário. Funciona para 32 bits e 64 bits.

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

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

    Atributos como Version=...ou processorArchitecture=...não são obrigatórios. Seu aplicativo carregará o correto, Oracle.DataAccess.dlldependendo da arquitetura selecionada e da estrutura .NET de destino (desde que esteja instalado corretamente) -> não 100% verificado

  • 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.dllarquivo 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\System32e crie um link simbólico ora112para a pasta C:\Oracle\11.2\Client_x64(veja abaixo)

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

  • Modifique a PATHvariável de ambiente, substitua todas as entradas como C:\Oracle\11.2\Client_x86e C:\Oracle\11.2\Client_x64por C:\Windows\System32\ora112, respectivas \binsubpastas. Nota: C:\Windows\SysWOW64\ora112não deve estar no ambiente PATH.

  • Se necessário, defina sua ORACLE_HOMEvariá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_HOMEcomoC:\Windows\System32\ora112

  • Defina o valor do Registro HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEcomo C:\Windows\System32\ora112(não C:\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:

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 posteriormente, selecione as pastas apropriadas para instalação.

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

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

Wernfried Domscheit
fonte
Esta IMO tem mais conhecimento para tirar do que a resposta real. Portanto, se eu tiver um aplicativo x86 para .net 4 e a versão do banco de dados estiver no 9i, qual versão do cliente um usuário precisaria ter se tivesse o Windows de 32 ou 64 bits? A Oracle diz que qualquer versão do cliente é compatível com qualquer versão do banco de dados. A resposta dos usuários de 32 bits instala a versão de 32 bits e os de 64 bits instalam a versão de 64 bits e usam o ODP.NET Managed Driver para decidir com qual SO está falando?
Luminous
1
Quando você usa o driver gerenciado ODP.NET, não é necessário instalar nenhum cliente Oracle - essa é a principal vantagem dele. Ele funciona com aplicativos x86 e x64. Sem o "Driver gerenciado ODP.NET", um aplicativo x86 também requer um cliente Oracle x86 (ou seja, 32 bits), independentemente da arquitetura do servidor de banco de dados.
Wernfried Domscheit
Acabei de encontrar o "Microsoft Visual C ++ 2010 Redistributable precisa ser instalado" - você deve adicioná-lo ao seu resumo.
Jay Sullivan
1
Eu não acho que este erro está relacionado ou causado pela Oracle ou ODP.NET
Wernfried Domscheit
Funciona para mim, eu instalo a Oracle.DataAccess.dllpartir do pacote nuget Oracle.DataAccess.x86e sua versão Dll é 2.112.1.0, portanto , eu instalei o Oracle Client com a versão Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) AQUI e resolvi o problema!
yu yang Jian
6

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

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>
psaxton
fonte
Obrigado! Sua solução me deu a ideia de que funciona após 2 dias (eu tenho o Visual Studio 2010 Net 4, cliente Oracle 10g) ... vejo o GAC e, é claro, instalei 3 versões do Oracle.DataAccess.dll, desinstalei tudo (e exclua chaves machine.config inválidas em "DbProviderFactories") e reinstale apenas o ODAC1120320 x64. E funciona.
Hernaldo Gonzalez
5

instale o ODP.Net na máquina de destino e deve resolver o problema ... copiar as dlls não parece uma boa ideia ...

HainKurt
fonte
5

Para o Oracle 11g (11.1.0.7.20), tive que adicionar as seguintes DLLs, juntamente com o meu Exe, para funcionar.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (bem grande perto de 30mb)
  4. Oracle.DataAccess.dll
SKG
fonte
Você quer dizer 130 MB
Elmue 19/04
2

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.

Peter Meyer
fonte
2

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
2

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!

Hydtechie
fonte
2

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.

<?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>
calderonsteven
fonte
2

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

  1. Sob o Oracle home localizado em, C:\oracle\product\11.2.0eu tinha uma pasta chamada client_1onde eu havia instalado ODP.NETbits anteriormente para o Windows 64 bits.

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

  3. Pesquisando no Google, descobri que isso estava acontecendo porque eu estava usando ODP.NET64 bits. Então peguei o ODP.NETWindows 32 bits e o instalei, mas continuava recebendo a mesma mensagem de erro.

  4. SOLUÇÃO: excluiu a pasta client_1e reinstalou ODP.NET32 bits. De certa forma, o instalador estava misturando bits da versão de 64 bits com a versão de 32 bits. Vai saber...

  5. Agora estou feliz novamente e posso abrir um novo OracleConnection. FINALMENTE! :)

Leniel Maccaferri
fonte
2

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!

dabor
fonte
1
Cara .... Oracle .... podemos conversar um pouco? Venha aqui, no canto. Escute, cara, passei o dia todo tentando descobrir o que diabos "provedor não compatível" significava, apenas para descobrir mais tarde que é porque alguma dependência de instalação não foi atendida. Por favor - não - exijo que você faça com que o instalador verifique essas dependências no momento da instalação e avise o usuário se elas não forem atendidas. Obrigado.
Jay Sullivan
3
A propósito, eu tive que voltar a essa pergunta de stackoverflow em várias ocasiões, e uma resposta diferente se aplica a mim todas as vezes. Que desperdício de tempo e dinheiro isso causou.
Jay Sullivan
2

Versão TLDR:

  • Use o provedor gerenciado 12c 100% .
  • Se você precisar usar o provedor antigo, precisará apontar Oracle.DataAccess.dll para as DLL Client Oracle não gerenciadas da versão correta. Se você possui vários clientes Oracle instalados em sua máquina, talvez seja simples incluir a variável de configuração "DllPath" (veja abaixo) na configuração do aplicativo, mas também pode ser necessário instalar um novo cliente Oracle para apontar.

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:

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

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 :

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

1. Diretório do aplicativo ou executável.

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

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

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

HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ version \ 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 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:

<configuration>
  <oracle.dataaccess.client> 
    <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
  </oracle.dataaccess.client>
</configuration>

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.

b_levitt
fonte
1

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?

DCookie
fonte
1

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.

doekman
fonte
1

Apenas duas etapas para resolver esse problema.

  1. vá para a configuração avançada do pool de aplicativos e defina o sinalizador 'Ativar aplicativo de 32 bits' como True.
  2. Certifique-se de que todas as DLLs em sua lixeira estejam na versão de 32 bits agora ...

boa sorte.

Mazhar Abbas
fonte
@ Mazhar-Abbas, você pode pls. assinalar em que posso definir 'Ativar aplicativo de 32 bits? Está no IIS ou no Project?
hiFI
1

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 carregava v4.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:

  1. Copiei Internal.dll de um dos projetos em execução com êxito no meu site /bin (apenas por segurança).
  2. Copiei o Oracle.DataAccess.dll de um dos projetos em execução com êxito para o meu site /bin .
  3. Adicione Referência a ambos no meu site.
  4. Finalmente, a referência Oracle.DataAccess apareceu em myWebSite.csproj, mas mostrou a versão errada: em v4.121.0.0vez de v4.112.3.0.
  5. Alterei manualmente a referência myWebSite.csprojpara, agora ela lê:

    <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> 
Robotron
fonte
2
É um realmente má idéia para adicionar uma referência para DLLs em uma pasta bin.
Jay Sullivan
1
As pastas bine objsã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 uma External Referencespasta onde você coloca suas dlls referenciadas.
Jay Sullivan
@ notfed Parece que você está certo. Manterá isso em minha mente.
Robotron
Como nomeado, é apenas um caminho de dica para o compilador, não uma referência forçada. Primeiro, o GAC é procurado pelo Oracle.DataAccess.dll. Deverá funcionar mesmo se você excluir HintPathcompletamente.
Wernfried Domscheit
1

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.

David Spenard
fonte
1

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 : insira a descrição da imagem aqui

Depois de : insira a descrição da imagem aqui

Para remover uma versão, basta excluir a pasta correspondente do GAC.

p4ulinux
fonte
0

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 :).

DiligentKarma
fonte
Observe que C:\Windows\assembliesapenas 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/…
Wernfried Domscheit
0

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

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

Cameron Castillo
fonte
3
Isso é realmente .NETish, não Oraclish
Jay Sullivan
0

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.

Greg Z.
fonte
-3

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

  1. Instalei o banco de dados 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 roda na máquina 192.168.1.158
  4. No servidor, você deve permitir explicitamente o acesso ao processo TNSLSNR.exe no Firewall do Windows . Esse processo escuta na porta 1521. Se você receber um erro de tempo limite no código abaixo, verifique seu firewall.
  5. OPÇÃO A: Para C # (.NET2 ou .NET4), é possível baixar o ODAC11 , do qual você precisa adicionar o Oracle.DataAccess.dll ao seu projeto. Além disso, esta DLL depende de: OraOps11w.dll, oci.dll, oraociei11.dll (130 MB!), Msvcr80.dll. Essas DLLs devem estar no mesmo diretório do EXE ou você deve especificar o caminho DLL em: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Em máquinas de 64 bits, escreva adicionalmente paraHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPÇÃO B: Se você baixou o ODAC12, precisa do Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 MB!), 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 deseja grandes DLLs com mais de 100 MB, faça o download do ODP.NET_Managed12.xxxxxxxx.zip no qual você encontra Oracle.ManagedDataAccess.dllapenas 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.
  8. O código C # a seguir funciona para mim sem nenhuma configuração no lado do servidor (apenas a instalação padrão):
using Oracle.DataAccess.Client;
ou
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Fonte de dados = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOLO = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVIDOR = DEDICATED)));"
    + "ID do usuário = SISTEMA; Senha = xxx;";

using (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    using (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "selecione TABLESPACE_NAME em DBA_DATA_FILES";

        using (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}
Elmue
fonte
Um exagero em instalar um servidor de banco de dados Oracle inteiro quando você só precisa de um cliente em execução.
Wernfried Domscheit
Você responde é pobre de qualquer maneira. Não é necessário copiar nenhuma DLL do Oracle no diretório do aplicativo porque, por instalação padrão, você as encontra através de ‰ PATH% (a menos que você a modifique por conta própria). A dica Registy se aplica apenas à versão 4.xe funciona apenas para o . cliente Oracle de 32 bits no entanto mismatchrs 32 bits versus 64 bits é o principal tema desta questão.
Wernfried Domscheit
Seu comentário mostra que você não leu minha resposta. Se eu quiser escrever um aplicativo que se comunique com um servidor Oracle, não há necessidade de instalar nada do Oracle. Eu apenas uso a DLL acima mencionada e a distribuo com meu aplicativo. Portanto, não haverá nada na variável PATH na máquina do usuário final. A propósito, o uso da variável PATH (que vem da antiga era do DOS de 1980) é altamente obsoleta no software moderno. Minha resposta recomenda a opção C, que não precisa de nenhum caminho de registro e não depende de 32 ou 64 bits. Mencionei as OPÇÕES A e B apenas por completude.
Elmue
Acho que sem a configuração adequada de% PATH%, o Windows não funcionará, mesmo na versão 10. Mencionei na minha resposta que não é inteligente copiar manualmente qualquer dll Oracle com seu aplicativo. Eu não sei o código fonte dessas DLLs, mas pode haver mais dependências do lado do cliente que você não vê, por exemplo, acionadas por configurações de idioma, conjuntos de caracteres, fuso horário etc. Quando eu faço um rastreamento com o Oracle.DataAccess.dllcomando 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.
Wernfried Domscheit
1
Acho que mencionei minhas preocupações: (1) Instalar um banco de dados é inútil, ou seja, um exagero. (2) As opções A e B funcionam apenas sob determinadas condições, por exemplo, não lê nenhuma configuração NLS do Registro (para a qual você precisa de um arquivo oracle.key). Para compatibilidade, você também deve levar em consideração as versões menores. Oracle.DataAccess, Version=2.112.2.0não funciona com a OraOps11w.dllversão 2.112.4.0, por exemplo.
Wernfried Domscheit