Il provider non è compatibile con la versione del client Oracle


157

Sto cercando di utilizzare Oracle ODP.NET 11g (11.1.0.6.20) Instant Client sul mio progetto ASP.net come fornitore di dati, ma quando eseguo la pagina aspx ottengo il messaggio " Il provider non è compatibile con la versione del messaggio di errore " client Oracle ". Qualsiasi aiuto sarebbe apprezzato.

Ho fatto riferimento al fornitore di dati in Visual Studio 2005 e il codice dietro è simile al seguente:

using Oracle.DataAccess.Client;
..

OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
    "Data Source=MyOracleServerName;" +
    "Integrated Security=SSPI";
oOracleConn.Open();

//Do Something

oOracleConn.Close();

L'errore per la pagina è simile al seguente:

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

Risposte:


91

Ho esaminato ulteriormente questo problema e devi semplicemente prendere tutte le DLL appropriate dalla stessa versione scaricata di ODP.Net e metterle nella stessa cartella del tuo file Exe, perché ODP.Net è pignolo di non mescolare numeri di versione.

Ho spiegato come fare qui: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c Ecco l'essenza di questo però:

  • Scarica ODP.Net
  • Decomprimi il file
  • Decomprimi tutti i JAR
  • Prendi queste dll che sono state appena decompresse:
    • oci.dll (rinominato da 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (rinominato da 'ociw32.dll.dbl')
  • Inserisci tutte le DLL nella stessa cartella del tuo eseguibile C #

4
La tua soluzione ha funzionato per me: ho trovato il tuo post sul blog prima di trovarlo. Tu sei l'uomo. Grazie! :-) Inoltre, usando l'ultima versione di ODAC, non avevo bisogno di decomprimere nessuno dei JAR ... i file .dll si trovavano in varie directory nella mia casa di Oracle. Una semplice ricerca di Windows li ha scoperti molto rapidamente.
Pandincus,

10
Inoltre, stavo usando l'ultima versione di ODAC (11.2.0.1.2) sulla mia macchina di sviluppo e gli unici file di cui avevo bisogno erano: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Come sottolinea Chris, ASSICURATI DI ESSERE NELLA STESSA CARTELLA COME IL TUO ESECUTIVO. ;-)
Pandincus,

1
Sembra che la versione più recente rende più facile trovare le DLL. Grande! Ora per quanto tempo l'oracolo li fa rotolare in una semplice dll ...
Chris

La strategia di Chris e il set di librerie di Pandincus hanno funzionato per me. Sto chiamando il client Oracle tramite PowerShell, quindi ho inserito il set di librerie nella directory eseguibile di PowerShell.
Quillbreaker

1
Probabilmente dovresti usare il driver gestito C # in questi giorni se puoi :)
Chris,

47

Dovresti "ignorare" tutte le chiacchiere x86 / x64 qui per cominciare e invece provare il driver gestito ODP.NET (se stai usando .Net v4 +):

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

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

Driver gestito o non gestito Oracle ODP.net

Evita tutti i "non gestiti" quali DLL quali problemi di architettura! : D (circa tempo Oracle).

Il pacchetto NuGet (funziona anche per 11g):

inserisci qui la descrizione dell'immagine

Il metodo vecchio / manuale:

Per informazioni su come convertire utilizzando le librerie gestite :

  • Innanzitutto, ecco un ottimo confronto del codice tra gestito e non gestito : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Assicurati di aver scaricato solo la versione XDPy di ​​Managed Driver XDPy
  • Dal file zip scaricato, copia e incolla nella directory del progetto:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Aggiungi un riferimento a Oracle.ManagedDataAccess.dll
  • Assicurati che il tuo exe sia rilasciato (aggiunto alla cartella dell'applicazione in VS2010) con entrambe le DLL

3
La sua buona notizia che Oracle ha finalmente un driver completamente gestito. Indossare quella dll da 100 MB è stato un vero onere.
Jafin,

1
il driver gestito funziona alla grande per me - non ho avuto problemi da quando ci sono passato / puoi riportare i tuoi progetti su AnyCPU ecc. e funziona benissimo :)
Tod Thomson

5
Solo così tutti sono consapevoli, mentre il provider gestito è carino, manca di molte funzionalità che il provider completo consente. Vale a dire, la crittografia integrata di Oracle.
Justin Skiles,

1
La documentazione di Oracle tende ad essere "sparsa" per non dire altro. Ecco un buon collegamento su alcuni metodi non supportati . Inoltre, il driver stesso viene fornito con un readmeche delinea alcune limitazioni.
Justin Skiles,

2
L'utilizzo del driver gestito è la soluzione finale! ho un incubo ogni volta che penso tutto il tempo trascorso quando ho avuto una mancata corrispondenza del tipo
ettore ct

35

Ho installato solo Oracle Data Provider per .NET 2.0 (11.1.0.6.20) e non ho installato Oracle Instant Client (11.1.0.6.0) .

L'ho appena installato e l'errore è scomparso!


3
Puoi semplicemente copiare le 4 DLL del client istantaneo nella stessa cartella del tuo EXE, invece di installare il client? (questi file: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris

2
@ Chris: Sì, puoi. Nella mia esperienza, tuttavia, hai bisogno di oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll e oracle.dataaccess.dll
Pakman

Al contrario, per me - avevo installato il client, ma non il provider
Ev.

33

Ciò può essere causato dall'esecuzione di un runtime .NET a 64 bit su un client Oracle a 32 bit. Questo può accadere se il tuo server sta eseguendo l'app su di essa a 64 bit. Eseguirà l'app .NET con il runtime a 64 bit. È possibile impostare il flag CPU sul progetto in VS per l'esecuzione nel runtime a 32 bit.


Ho appena incontrato questo. Ha funzionato in un'app di test (a 32 bit), quindi è caduto in IIS. Invece di richiedere che tutti gli assembly coinvolti siano a 32 bit, ho cambiato in un AppPool a 32 bit.
anton.burger,

22

Facciamo una sorta di riassunto:

Il messaggio di errore "Il provider non è compatibile con la versione del client Oracle" può essere causato da diversi motivi.

  • Non è installato alcun client Oracle. In questo caso il messaggio di errore è davvero fuorviante.

    Oracle Data Provider for .NET (ODP.NET, cioè il file Oracle.DataAccess.dll) non è incluso nella Oracle Instant Client deve essere installato separatamente (download da 32 bit Oracle Data Access Components (ODAC) o 64-bit di Oracle Data Access Components ( ODAC) oppure devi selezionare l'opzione corrispondente in Oracle Universal Installer (OUI).

    Nota, quando si installa Oracle Data Provider> = 12.1, il provider non viene automaticamente registrato in GAC. È necessario registrarlo manualmente se necessario, consultare Oracle Doc 2272241.1 .

  • La versione di ODP.NET non corrisponde alla versione installata di Oracle Client. Devi controllare anche il numero di versione minore! Ad esempio, la Oracle.DataAccess.dllversione 4.112.3.0 non è compatibile con Oracle Client 11.2.0.4 . Controllare attentamente le versioni di ODP.NET e Oracle Client. È possibile utilizzare sigcheck su oraociei*.dlle / o OraOps*w.dllper ottenere la versione di Oracle Client.

    Essere consapevoli dei diversi schemi di numerazione. Versione file 4.112.3.0 mezzi: .NET Framework versione 4, Oracle rilascio 11.2.0.3.x .

    Esistono versioni ODP.NET "1.x", "2.x" e "4.x". Questi numeri sono correlati alle versioni di Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 e 4.0.30319. La versione "1.x" era disponibile fino a Oracle Client 11.1. La versione "4.x" è stata introdotta con Oracle Client 11.2

  • L'architettura (32 bit o 64 bit) di ODP.NET non corrisponde all'architettura dell'applicazione. Un'applicazione a 32 bit funziona solo con Oracle Client / ODP.NET a 32 bit, rispettivamente un'applicazione a 64 bit richiede Oracle Client / ODP.NET a 64 bit. (A meno che non si utilizzi il driver gestito ODP.NET )

  • La versione di .NET Framework non corrisponde. Ad esempio, se si compila l'applicazione con Target .NET Framework 2.0, non è possibile utilizzare ODP.NET versione 4.x. La versione di destinazione di .NET Framework deve essere uguale o successiva alla versione di ODP.NET.

  • La versione di Oracle.DataAccess.dllsulla tua macchina di sviluppo (cioè la versione che viene caricata durante la compilazione) è superiore alla versione sulla macchina di destinazione.

  • Tenere presente che Oracle.DataAccess.dllpotrebbe essere caricato da GAC che per impostazione predefinita ha la precedenza su qualsiasi file fornito localmente.

soluzioni

  • Si consiglia di utilizzare il driver gestito ODP.NET, che può essere scaricato dalla pagina Oracle: download ODAC (Oracle Data Access Components) a 64 bit . Lì devi solo copiare il Oracle.ManagedDataAccess.dllfile nella directory dell'applicazione, non è necessario nient'altro. Funziona sia a 32 bit che a 64 bit.

  • Nel tuo *.csproj, resp. *.vbprojmodifica il tuo riferimento a ODP.NET in questo modo:

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

    Attributi come Version=...o processorArchitecture=...non sono richiesti. L'applicazione caricherà il corretto in Oracle.DataAccess.dllbase all'architettura selezionata e al framework .NET di destinazione (a condizione che sia installato correttamente) -> non verificato al 100%

  • Nel caso in cui non si conosca la versione di Oracle Client sul computer di destinazione (ad esempio, potrebbe essere il computer del proprio cliente): accedere alla pagina di download sopra menzionata e scaricare la versione XCopy minima di Oracle Data Access Components. Estrai lo zip e copia solo il Oracle.DataAccess.dllfile sul tuo computer locale. Nel tuo progetto VS fai un riferimento a questa DLL (molto probabilmente obsoleta). La versione di questa DLL è la versione minima di ODP.NET con cui funzionerà l'applicazione. Quando si esegue l'applicazione, i criteri del publisher in GAC reindirizzeranno alla versione effettivamente installata.

  • Non penso che sia un approccio intelligente prendere singole DLL e copiarle in determinate cartelle. Potrebbe funzionare su un computer "nudo" ma se il computer di destinazione ha installato prodotti Oracle, esiste un rischio elevato di mancata corrispondenza della versione. Disinstallare tutti i prodotti Oracle dal computer ed eseguire una nuova installazione. Dai un'occhiata a Come disinstallare / rimuovere completamente Oracle 11g (client)? ordina di ottenere una macchina davvero pulita.

  • Nel caso in cui si debba lavorare con applicazioni a 32 e 64 bit contemporaneamente, seguire queste istruzioni per installare entrambe le versioni su un computer:

Presupposti: Oracle Home viene chiamato OraClient11g_home1, la versione client è 11gR2.

  • Opzionalmente rimuovere qualsiasi client Oracle installato

  • Scarica e installa Oracle x86 Client, ad esempio in C:\Oracle\11.2\Client_x86

  • Scarica e installa Oracle x64 Client in una cartella diversa, ad esempio C:\Oracle\11.2\Client_x64

  • Apri lo strumento da riga di comando, vai alla cartella% WINDIR% \ System32, in genere C:\Windows\System32e crea un collegamento simbolico ora112alla cartella C:\Oracle\11.2\Client_x64(vedi sotto)

  • Passa alla cartella% WINDIR% \ SysWOW64, in genere C:\Windows\SysWOW64e crea un collegamento simbolico ora112alla cartella C:\Oracle\11.2\Client_x86(vedi sotto)

  • Modifica la PATHvariabile di ambiente, sostituisci tutte le voci come C:\Oracle\11.2\Client_x86e C:\Oracle\11.2\Client_x64con C:\Windows\System32\ora112, rispettivamente la loro \binsottocartella. Nota: C:\Windows\SysWOW64\ora112non deve essere in ambiente PATH.

  • Se necessario, impostare ORACLE_HOMEla variabile di ambiente suC:\Windows\System32\ora112

  • Apri l'editor del registro. Impostare il valore del Registro di sistema HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEsuC:\Windows\System32\ora112

  • Imposta il valore del Registro di sistema HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEsu C:\Windows\System32\ora112(non C:\Windows\SysWOW64\ora112)

  • Hai fatto! Ora puoi usare il client Oracle x86 e x64 senza soluzione di continuità, ovvero un'applicazione x86 caricherà le librerie x86, un'applicazione x64 caricherà le librerie x64 senza ulteriori modifiche sul tuo sistema.

Comandi per creare collegamenti simbolici:

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

Alcune note:

  • Entrambi i collegamenti simbolici devono avere lo stesso nome, ad es ora112.

  • Nel caso in cui si desideri installare ODP.NET manualmente in seguito, assicurarsi di selezionare le cartelle appropriate per l'installazione.

  • Nonostante i loro nomi, la cartella C:\Windows\System32contiene le librerie x64, mentre C:\Windows\SysWOW64contiene le librerie x86 (32 bit). Non essere confuso.

  • Forse è un'opzione saggia per impostare la TNS_ADMINvariabile di ambiente (risp. TNS_ADMINVoci nel Registro di sistema) su una posizione comune, ad esempio TNS_ADMIN=C:\Oracle\Common\network.


Questa IMO ha più conoscenza da portare della risposta effettiva. Quindi, se ho un'applicazione x86 per .net 4 e la versione del database è in 9i, quale versione client dovrebbe avere un utente se ha Windows a 32 o 64 bit? Oracle afferma che qualsiasi versione client è compatibile con qualsiasi versione db. La risposta con gli utenti a 32 bit installa la versione a 32 bit e gli utenti a 64 bit installano la versione a 64 bit e utilizzano il driver gestito ODP.NET per decidere con quale sistema operativo sta parlando?
Luminoso

1
Quando si utilizza il driver gestito ODP.NET, non è necessario installare alcun client Oracle: questo è il vantaggio principale. Funziona con entrambe le applicazioni, x86 e x64. Senza "ODP.NET Managed Driver" un'applicazione x86 richiede anche un client Oracle x86 (ovvero 32 bit), indipendentemente dall'architettura del server di database.
Wernfried Domscheit,

Ho appena incontrato "Microsoft Visual C ++ 2010 Redistributable deve essere installato" - dovresti aggiungerlo al tuo riepilogo.
Jay Sullivan,

1
Non credo che questo errore sia correlato o causato da Oracle o ODP.NET
Wernfried Domscheit,

Funziona per me, installo Oracle.DataAccess.dlldal pacchetto nuget Oracle.DataAccess.x86, e la sua versione Dll è 2.112.1.0, quindi abbino installare Oracle Client con la versione Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) QUI, quindi il problema è stato risolto!
yu yang Jian,

6

Dopo diverse ore di risoluzione dei problemi, ho riscontrato che questo problema era causato dall'avere Oracle.DataAccess.dll (v4.0) nella directory bin dei miei progetti, ma il runtime caricava anche Oracle.DataAccess.dll (v2.x) dal GAC. Rimuovere e leggere la voce Oracle.DataAccess nei riferimenti del progetto ha risolto il problema per me.

Gli altri file menzionati qui non sembravano essere necessari nella mia situazione.

AGGIORNARE

La causa principale dell'errore "Il provider non è compatibile con la versione del client Oracle" è (generalmente) che l'assembly gestito sta tentando di caricare librerie non gestite che non corrispondono alle versioni. Sembra che sia possibile forzare il driver Oracle a utilizzare le librerie corrette specificando il percorso della libreria in web.config 1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>

Grazie! La tua soluzione mi dà l'idea che funzioni dopo 2 giorni (ho Visual Studio 2010 Net 4, client Oracle 10g) ... Vedo GAC e ovviamente ho installato 3 versioni di Oracle.DataAccess.dll, ho disinstallato tutto (e eliminare le chiavi machine.config non valide in "DbProviderFactories") e reinstallare solo ODAC1120320 x64. E funziona.
Hernaldo Gonzalez,

5

installa ODP.Net sul computer di destinazione e dovrebbe risolvere il problema ... copiare la DLL non sembra una buona idea ...


5

Per Oracle 11g (11.1.0.7.20) ho dovuto aggiungere le seguenti dll insieme al mio Exe per funzionare.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (abbastanza enorme vicino a 30mb)
  4. Oracle.DataAccess.dll

Volete dire 130 MB
Elmue,

2

Mi sembra che sebbene tu abbia ODP con Oracle Istant Client, l'ODP potrebbe invece provare a utilizzare l'attuale client Oracle. Sul computer è installato anche un client Oracle standard? Ricordo che Oracle era piuttosto esigente quando si trattava di più client sulla stessa macchina.


2

Ho avuto lo stesso identico problema. Ho eliminato (e dimenticato di aver eliminato) oraociei11.dll dopo aver compilato l'applicazione. E stava dando questo errore durante il tentativo di esecuzione. Quindi quando non riesce a trovare la dll che oraociei11.dll, mostra questo errore. Potrebbero esserci altri casi in cui dà questo errore, ma questo sembra essere uno di questi.


2

Cerca anche il pool di applicazioni IIS Abilita flag vero o falso a 32 bit, quando vedi questo messaggio, un forum Oracle mi ha indirizzato per questo!


2

ho lo stesso problema, ma nel mio caso non posso semplicemente copiare le dll nella cartella bin, quindi posso solo "ricollegare" la versione dell'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>

2

Ecco cosa ho fatto per risolvere questo problema che è persistito per 3 lunghe ore:

  1. Nella home Oracle situata in C:\oracle\product\11.2.0ho avuto una cartella chiamata in client_1cui avevo precedentemente installato ODP.NETbit per Windows 64 bit.

  2. Successivamente, durante il tentativo di eseguire il debug della mia app API Web ASP.NET con Visual Studio 2012, ho continuato a ricevere questo messaggio di errore: Il provider non è compatibile con la versione del client Oracle .

  3. Cercando su Google ho scoperto che questo stava accadendo perché stavo usando ODP.NET64 bit. Quindi ho preso ODP.NETWindows 32 bit e l'ho installato ma ho continuato a ricevere lo stesso messaggio di errore.

  4. SOLUZIONE: eliminata la cartella client_1e reinstallato ODP.NET32 bit. In qualche modo il programma di installazione stava mescolando i bit dalla versione a 64 bit con la versione a 32 bit. Vai a capire...

  5. Ora sono di nuovo felice e posso aprirne uno nuovo OracleConnection. FINALMENTE! :)


2

Per chiunque abbia ancora questo problema: basato su questo articolo

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

Ho scoperto che sul mio server mancava la libreria Visual Runtime di Microsoft C ++ - l'avevo sul mio computer di sviluppo a causa di Visual Studio installato. Ho scaricato e installato la versione (attualmente) più recente della libreria da qui:

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

Ho eseguito l'installazione e la chiamata dell'oracolo da C #!


1
Amico .... Oracle .... possiamo fare una piccola discussione? Vieni qui, nell'angolo. Ascolta amico, ho passato tutto il giorno a capire cosa diavolo avrebbe dovuto significare "provider non compatibile", solo per scoprire in seguito che è perché non era stata rispettata una dipendenza dall'installazione. Si prega - no - io pretendo che fate il vostro installatore di controllo per queste dipendenze in fase di installazione, e avvisare l'utente se non è soddisfatta. Grazie.
Jay Sullivan,

3
A proposito, ho dovuto tornare a questa domanda stackoverflow in più occasioni, e ogni volta mi si applica una risposta diversa. Che spreco di tempo e denaro questo ha causato.
Jay Sullivan,

2

Versione TLDR:

  • Utilizzare invece il provider gestito al 100% 12c .
  • Se è necessario utilizzare il vecchio provider, è necessario puntare Oracle.DataAccess.dll alle DLL client Oracle non gestite della versione corretta. Se sul tuo computer sono installati più client Oracle che potrebbero essere semplici come l'inclusione della variabile di configurazione "DllPath" (vedi sotto) nella configurazione dell'app, ma potrebbe essere necessario installare un nuovo client Oracle a cui puntare.

Versione completa:

Innanzitutto, assicuriamoci di comprendere i componenti del vecchio provider non gestito (non il nuovo provider gestito al 100% al 12c). È composto da due pezzi:

  1. il componente .net gestito - Oracle.DataAccess.dll
  2. il client non gestito (non.net)

In poche parole, Oracle.DataAccess.dll è quasi solo un wrapper, traducendo le istruzioni .net in istruzioni ORACLE-NET per il client non gestito.

Detto questo, quando si carica Oracle.DataAccess c'è un ordine in cui tenta di individuare le DLL client non gestite di cui ha bisogno. Dalla documentazione Oracle :

Oracle.DataAccess.dll cerca DLL non gestite dipendenti (come Oracle Client) in base al seguente ordine:

1.Directory dell'applicazione o eseguibile.

2.Impostazione DllPath specificata da application config o web.config.

3.Impostazione DllPath specificata da machine.config.

4.DllPath impostazione specificata dal registro di Windows.

HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ versione \ DllPath

5.Directory specificate dalla variabile d'ambiente PATH di Windows.

Quindi, nel tuo caso, la tua app ha seguito questo processo sopra e ha trovato un percorso con DLL non gestite che sono troppo vecchie rispetto all'assembly Oracle.DataAccess.dll che stai utilizzando.

Potrebbe essere che l'unico client Oracle installato su quella macchina sia troppo vecchio. Ma questo entra in gioco se sul computer sono installati più client e i file non gestiti sono stati trovati per primi in un'installazione diversa ma precedente. Se in seguito, la cosa semplice da fare è usare la variabile di configurazione dllPath nella tua configurazione e puntarla sulla cartella Oracle Home Bin corretta:

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

Se si desidera installare una nuova copia del client, la versione xcopy è la più piccola e contiene il "client istantaneo" e punta DllPath sopra in questa nuova posizione. Ma qualsiasi installazione client Oracle funzionerà.

Ma se vuoi evitare tutta questa roba di risoluzione client non gestita, vedi se puoi aggiornare la tua app per utilizzare invece il provider gestito al 100%: in realtà si tratta solo di uno o due assembly gestiti, senza alcuna dipendenza da file non gestiti.

È anche possibile che non stai caricando Oracle.DataAccess.dll che ritieni di essere se è installato sia nella tua directory bin che nel tuo GAC, ma penso che sia il senario meno probabile. Vedere il processo di risoluzione dell'assembly per ulteriori informazioni.


1

L'utente IIS / IWAM dispone delle autorizzazioni per la directory Oracle? È possibile connettersi a questa origine dati utilizzando un'altra app, come Excel o Access?


1

Abbiamo avuto lo stesso problema, perché l'assembly Oracle.Data.dll su una condivisione di rete è stato aggiornato dai nostri DBA. Rimuovere il riferimento dal progetto e aggiungerlo di nuovo ha risolto il problema.


1

Solo due passaggi per risolvere questo problema.

  1. vai all'impostazione avanzata del pool di applicazioni e imposta il flag "Abilita applicazione a 32 bit" su True.
  2. Assicurati che tutte le DLL nel tuo Bin siano ora a 32 bit ...

buona fortuna.


@ mazhar-abbas, puoi pls. precisare in quale posso impostare 'Abilita applicazione a 32 bit? È in IIS o Project?
hiFI,

1

Non ho intrapreso la strada per ottenere nuove DLL. Avevamo un sacco di progetti esistenti che funzionavano perfettamente ed era solo il mio nuovo progetto a farmi venire il mal di testa, quindi ho deciso di provare qualcos'altro.

Il mio progetto utilizzava un Internal.dll sviluppato internamente che dipendeva da Oracle.DataAccess.dll v4.112.3.0. Per qualche motivo, durante la pubblicazione, Visual Studio v4.121.0.0veniva sempre caricato , anche se non era stato esplicitamente specificato in nessuno dei file di configurazione. Ecco perché stavo ricevendo un errore.

Quindi quello che ho fatto è stato:

  1. Copia Internal.dll da uno dei progetti in esecuzione con successo sul mio sito Web /bin(solo per essere al sicuro).
  2. Ho copiato Oracle.DataAccess.dll da uno dei progetti eseguiti correttamente sul mio sito web /bin.
  3. Aggiungi riferimento a entrambi dal mio sito web.
  4. Alla fine il riferimento Oracle.DataAccess è apparso in myWebSite.csproj, ma ha mostrato la versione sbagliata: v4.121.0.0invece di v4.112.3.0.
  5. Ho modificato manualmente il riferimento in myWebSite.csproj, quindi ora legge:

    <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
È davvero una cattiva idea aggiungere un riferimento alle DLL in una cartella bin.
Jay Sullivan,

1
Le cartelle bine objsono cartelle di output ; questo è dove vanno le DLL quando costruisci il tuo progetto. Dovresti essere in grado di eliminare queste cartelle in qualsiasi momento senza creare conflitti. Di solito queste cartelle vengono ignorate nel controllo del codice sorgente. La pratica standard è quella di creare una External Referencescartella in cui inserire le DLL di riferimento.
Jay Sullivan,

@notfed Sembra che tu abbia ragione. Lo terrò a mente.
Robotron,

Come indicato, è solo un percorso di suggerimento per il compilatore, non un riferimento forzante. Innanzitutto, viene cercato il GAC per Oracle.DataAccess.dll. Dovrebbe funzionare anche se si elimina del HintPathtutto.
Wernfried Domscheit,

1

Ho riscontrato questo problema dopo aver installato Oracle Data Tools per Visual Studio 2015 e poi aver combattuto con Oracle per un'ora buona. Ho deciso di provare a reinstallare il client Oracle invece di questo pasticcio con la copia dei file, le modifiche alla configurazione, ecc., E ha funzionato per me.


1

Ho affrontato un problema simile e la causa principale era che GAC aveva 2 versioni oracle.dataaccess cioè v4.0_4.112.2.0 e v4.0_4.112.4.0. La mia applicazione si riferiva a v4.0_4.112.2.0, quindi quando ho rimosso v4.0_4.112.4.0 da GAC, ha funzionato bene.

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

Prima : inserisci qui la descrizione dell'immagine

Dopo : inserisci qui la descrizione dell'immagine

Per rimuovere una versione, si può semplicemente eliminare la cartella corrispondente da GAC.


0

Di recente ho dovuto lavorare su un vecchio progetto in cui la soluzione e tutti i progetti contenuti erano indirizzati alla piattaforma x32. Ho continuato a provare a copiare Oracle.DataAccess.dll e tutti gli altri file Oracle suggeriti in tutti i punti, ma ho colpito il muro ogni volta. Alla fine la lampadina nella testa si accese (dopo 8 ore :)) e chiese di controllare gli assemblaggi ODAC installati e la loro piattaforma. Avevo già installato tutti i client ODAC a 64 bit (x64) ma non quelli a 32 bit (x32). Ha installato l'ODAC a 32 bit e il problema è scomparso.

Come verificare la versione di ODAC installato: cercare nella cartella C: \ Windows \ assembly. La proprietà "Processor Architecture" informerà la piattaforma di ODAC installato.

Otto ore sono molte per l'accensione della lampadina. Non c'è da stupirsi che devo sempre fare lo slog al lavoro :).


Nota: C:\Windows\assembliesmostra solo gli assembly fino a .NET framework versione 2.0. La versione 3.x / 4.x non vengono visualizzati, vedere stackoverflow.com/questions/28213105/...
Wernfried Domscheit

0

La soluzione di Chris ha funzionato anche per me. Ho comunque ricevuto un seguente messaggio di errore che indica:

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.

Apparentemente, nella lingua straniera di Oraclish, ciò significa che il tuo programma ha come target tutte le piattaforme o macchine a 32 bit. Cambia semplicemente la tua piattaforma di destinazione in Proprietà progetto a 64 bit e spera per il meglio.


3
Questo è in realtà .NETish, non Oraclish
Jay Sullivan il

0

Ho avuto lo stesso problema con Oracle.DataAccess.dll v4.121.2.0. con installazione a 2 case (versioni a 32 e 64 bit). Versione a 32 bit workerd, versione a 64 bit no.

Nel mio caso (dopo 2 giorni di tentativi) ho scoperto che il problema riguardava le autorizzazioni per la versione a 64 bit-home. Molte directory in quella versione avevano autorizzazioni esclusivamente sovrascritte in cui il ruolo "Utenti autenticati" non aveva accesso "Lettura", che è impostato di default sulla directory padre. Tali sottodirectory includevano "bin", "network / admin", "nls", "oracore", "RDBMS" e possibilmente altri. Li ho trovati filtrando il risultato "ACCESS DENIED" nell'utilità "Process Monitor" (Procmon.exe) da sysinternals. Una volta che le autorizzazioni sono state ereditate dalla directory principale in quelle sottodirectory secondarie, tutto ha iniziato a funzionare.

Non avevo intenzione di ignorare le autorizzazioni sull'intera home di Oracle, quindi le ho fatte una directory alla volta, ma immagino che se non ti preoccupi così tanto della sicurezza, puoi reimpostarla sull'intera directory home di Oracle corrispondente.



-3

Molte risposte teoriche qui, ma ecco un esempio funzionante con codice che puoi copiare, incollare e testare immediatamente:

  1. Ho installato il database Oracle Express OracleXE112 che già include alcune tabelle demo preinstallate.
  2. Quando si avvia il programma di installazione, viene richiesta una password . Ho inserito "xxx" come password. (non utilizzato in produzione)
  3. Il mio server funziona sulla macchina 192.168.1.158
  4. Sul server è necessario consentire esplicitamente l'accesso per il processo TNSLSNR.exe in Windows Firewall . Questo processo è in ascolto sulla porta 1521. Se si verifica un errore di timeout dal codice seguente, controllare il firewall.
  5. OPZIONE A: Per C # (.NET2 o .NET4) è possibile scaricare ODAC11 , da cui è necessario aggiungere Oracle.DataAccess.dll al progetto. Inoltre, questa DLL dipende da: OraOps11w.dll, oci.dll, oraociei11.dll (130 MB!), Msvcr80.dll. Queste DLL devono essere nella stessa directory del file EXE o è necessario specificare il percorso DLL in: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Su macchine a 64 bit scrivere in aggiunta aHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPZIONE B: Se hai scaricato ODAC12 hai bisogno di Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 MB!), Oraons.dll, msvcr100.dll. Il percorso del registro èHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPZIONE C: Se non desideri enormi DLL di oltre 100 MB, scarica ODP.NET_Managed12.xxxxxxxx.zip in cui trovi Oracle.ManagedDataAccess.dllsolo 4 MB ed è una DLL gestita pura che funziona con processi a 32 e 64 bit e non dipende da altre DLL e non richiede alcuna voce di registro.
  8. Il seguente codice C # funziona per me senza alcuna configurazione sul lato server (solo l'installazione predefinita):
utilizzando Oracle.DataAccess.Client;
o
utilizzando Oracle.ManagedDataAccess.Client;

....

string oradb = "Origine dati = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVER = DEDICATED)));"
    + "ID utente = SISTEMA; Password = xxx;";

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

        using (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr [ "TABLESPACE_NAME"]);
            }
        }
    }
}

Un trucco eccessivo per installare l'intero server di database Oracle quando hai solo bisogno di un client in esecuzione.
Wernfried Domscheit,

La tua risposta è comunque scarsa. Non è necessario copiare alcuna dll Oracle nella directory dell'applicazione perché, per impostazione predefinita, li trovi attraverso ‰ PATH% (a meno che non lo modifichi da solo) Il suggerimento Registy si applica solo a.version 4.x e funziona solo per Client Oracle a 32 bit. Tuttavia, l'argomento principale di questa domanda è la mancata corrispondenza tra 32 bit e 64 bit.
Wernfried Domscheit,

Il tuo commento mostra che non hai letto la mia risposta. Se voglio scrivere un'applicazione che comunica con un server Oracle, non è necessario installare nulla da Oracle. Uso solo la DLL sopra menzionata e la distribuisco con la mia applicazione. Quindi non ci sarà nulla nella variabile PATH sul computer dell'utente finale. A proposito, l'utilizzo della variabile PATH (che proviene dalla vecchia era DOS dal 1980) è altamente deprecato nei software moderni. La mia risposta raccomanda OPZIONE C che non necessita di alcun percorso di registro e non dipende da 32 o 64 bit. Ho citato le OPZIONI A e B solo per completezza.
Elmue,

Penso che senza l'impostazione corretta di% PATH% il tuo Windows non funzionerà affatto - anche nella versione 10. Nella mia risposta ho menzionato che non è intelligente copiare manualmente qualsiasi DLL Oracle con la tua applicazione. Non conosco il codice sorgente di queste dll ma potrebbero esserci più dipendenze dal tuo lato cliente che non vedi, ad esempio attivate da impostazioni della lingua, set di caratteri, fuso orario, ecc. Quando faccio una traccia con Oracle.DataAccess.dllallora il programma carica in totale 35 DLL Oracle! Meglio effettuare una normale installazione di Oracle Client, ovviamente a meno che non si utilizzi il driver gestito ODP.NET.
Wernfried Domscheit,

1
Penso di aver menzionato le mie preoccupazioni: (1) L'installazione di un database è inutile, cioè eccessiva. (2) Le opzioni A e B funzionano solo a determinate condizioni, ad esempio non legge le impostazioni NLS dal registro (per le quali è necessario il file oracle.key). Per motivi di compatibilità, è necessario tenere conto anche delle versioni secondarie. Oracle.DataAccess, Version=2.112.2.0non funziona con la OraOps11w.dllversione 2.112.4.0 per esempio.
Wernfried Domscheit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.