Le fournisseur n'est pas compatible avec la version du client Oracle

157

J'essaie d'utiliser le client instantané Oracle ODP.NET 11g (11.1.0.6.20) sur mon projet ASP.net en tant que fournisseur de données, mais lorsque j'exécute la page aspx, j'obtiens un message " Le fournisseur n'est pas compatible avec la version du message d'erreur du client Oracle ". Toute aide serait appréciée.

J'ai référencé le fournisseur de données dans Visual Studio 2005 et le code derrière ressemble à ceci:

using Oracle.DataAccess.Client;
..

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

//Do Something

oOracleConn.Close();

L'erreur de la page ressemble à ceci:

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

Réponses:

91

J'ai étudié ce problème plus en détail, et vous devez simplement récupérer toutes les DLL appropriées de la même version téléchargée de ODP.Net et les mettre dans le même dossier que votre fichier Exe, car ODP.Net est difficile de ne pas mélanger numéros de version.

J'ai expliqué comment faire cela ici: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c En voici l'essentiel:

  • Téléchargez ODP.Net
  • Décompressez le fichier
  • Décompressez tous les JAR qu'il contient
  • Récupérez ces DLL qui viennent d'être décompressées:
    • oci.dll (renommé de «oci.dll.dbl»)
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (renommé de «ociw32.dll.dbl»)
  • Mettez toutes les DLL dans le même dossier que votre exécutable C #
Chris
la source
4
Votre solution a fonctionné pour moi - j'ai trouvé votre article de blog avant de le trouver. Tu es l'homme. Merci! :-) De plus, en utilisant la dernière version de l'ODAC, je n'ai eu besoin de décompresser aucun des JAR ... les fichiers .dll se trouvaient dans divers répertoires de mon oracle home. Une simple recherche dans Windows les a montés très rapidement.
Pandincus
10
De plus, j'utilisais la dernière version d'ODAC (11.2.0.1.2) sur ma machine de développement, et les seuls fichiers dont j'avais besoin étaient: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Comme Chris le fait remarquer, ASSUREZ-VOUS QU'ILS SONT DANS LE MÊME DOSSIER QUE VOTRE EXÉCUTABLE. ;-)
Pandincus
1
On dirait que la nouvelle version facilite la recherche des DLL. Génial! Maintenant , combien de temps jusqu'à ce que les rouleaux d'oracle dans une dll simple , ...
Chris
La stratégie de Chris et la bibliothèque de Pandincus ont fonctionné pour moi. J'appelle le client oracle via PowerShell, je place donc l'ensemble de bibliothèques dans le répertoire exécutable de PowerShell.
quillbreaker
1
Vous devriez probablement utiliser le pilote géré C # ces jours-ci si vous le pouvez :)
Chris
47

Vous devez «ignorer» toutes les discussions sur x86 / x64 ici pour commencer et essayer à la place le pilote géré ODP.NET (si vous utilisez .Net v4 +):

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

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

Pilote géré ou non géré par Oracle ODP.net

Évitez toutes les DLL «non gérées» quelles problèmes d'architecture! : D (à peu près temps Oracle).

Le package NuGet (fonctionne également pour 11g):

entrez la description de l'image ici

La méthode ancienne / manuelle:

Pour plus d'informations sur la conversion à l'utilisation des bibliothèques gérées :

  • Tout d'abord, voici une excellente comparaison de code entre géré et non géré : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Assurez-vous d'avoir téléchargé la version ODP.NET, Managed Driver Xcopy uniquement
  • À partir du fichier zip téléchargé, copiez et collez dans le répertoire de votre projet:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Ajouter une référence à Oracle.ManagedDataAccess.dll
  • Assurez-vous que votre exe est publié (ajouté au dossier d'application dans VS2010) avec les deux dll
Tod Thomson
la source
3
C'est une bonne nouvelle qu'Oracle dispose enfin d'un pilote entièrement géré. Trainer cette DLL de 100 Mo a été un véritable fardeau.
Jafin
1
le pilote géré fonctionne très bien pour moi - je n'ai eu aucun problème depuis que je suis passé à lui / vous pouvez rétablir vos projets sur AnyCPU, etc. et cela fonctionne très bien :)
Tod Thomson
5
Pour que tout le monde le sache, bien que le fournisseur géré soit agréable, il lui manque beaucoup de fonctionnalités que le fournisseur complet permet. À savoir, le cryptage intégré d'Oracle.
Justin Skiles
1
La documentation d'Oracle a tendance à être "dispersée" pour dire le moins. Voici un bon lien sur certaines méthodes non prises en charge . De plus, le pilote lui-même est livré avec un readmequi décrit certaines limitations.
Justin Skiles
2
L'utilisation du pilote géré est la solution finale! J'ai un nitghtmare à chaque fois que je pense que tout le temps passé quand j'ai eu une incompatibilité de type
ettore ct
35

J'ai uniquement installé le fournisseur de données Oracle pour .NET 2.0 (11.1.0.6.20) et je n'ai pas installé Oracle Instant Client (11.1.0.6.0) .

Je viens de l'installer et l'erreur a disparu!

EverTheLearner
la source
3
Pouvez-vous simplement copier les 4 DLL du client instantané dans le même dossier que votre EXE, au lieu d'installer le client? (ces fichiers: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Chris
2
@Chris: Oui, vous pouvez. D'après mon expérience, cependant, vous avez besoin de oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll et oracle.dataaccess.dll
Pakman
Autre moyen pour moi - j'avais installé le client, mais pas le fournisseur
Ev.
33

Cela peut être dû à l'exécution d'un runtime .NET 64 bits sur un client Oracle 32 bits. Cela peut se produire si votre serveur sur lequel vous exécutez l'application 64 bits. Il exécutera l'application .NET avec le moteur d'exécution 64 bits. Vous pouvez définir l'indicateur CPU sur votre projet dans VS pour qu'il s'exécute dans le runtime 32 bits.

Daniel
la source
Je viens de tomber sur celui-ci. A travaillé dans une application de test (32 bits), puis est tombé dans IIS. Plutôt que d'exiger que tous les assemblys impliqués soient 32 bits, j'ai changé pour un AppPool 32 bits.
anton.burger
22

Faisons une sorte de résumé:

Le message d'erreur "Le fournisseur n'est pas compatible avec la version du client Oracle" peut être causé par plusieurs raisons.

  • Aucun client Oracle n'est installé. Dans ce cas, le message d'erreur est effectivement trompeur.

    Oracle Data Provider for .NET (ODP.NET, ce fichier Oracle.DataAccess.dll) ne sont pas inclus dans le client Oracle Instant, il doit être installé séparément (téléchargement de 32 bits Composants Oracle Data Access (ODAC) ou 64 bits Composants Oracle Data Access ( ODAC) Téléchargements ) ou vous devez sélectionner l'option correspondante dans Oracle Universal Installer (OUI).

    Notez que lors de l'installation du fournisseur de données Oracle> = 12.1, le fournisseur n'est pas automatiquement enregistré dans GAC. Vous devez l'enregistrer manuellement si nécessaire, voir Oracle Doc 2272241.1 .

  • La version d'ODP.NET ne correspond pas à la version installée d'Oracle Client. Vous devez vérifier même le numéro de version mineure! Par exemple, la Oracle.DataAccess.dllversion 4.112.3.0 n'est pas compatible avec Oracle Client 11.2.0.4 . Vérifiez attentivement les versions d'ODP.NET et d'Oracle Client. Vous pouvez utiliser sigcheck sur oraociei*.dllet / ou OraOps*w.dllpour obtenir la version d'Oracle Client.

    Soyez conscient des différents schémas de numérotation. Version du fichier 4.112.3.0 moyen: .NET Framework Version 4, Oracle presse 11.2.0.3.x .

    Il existe les versions ODP.NET "1.x", "2.x" et "4.x". Ces chiffres sont liés aux versions 1.0.3705 / 1.1.4322, 2.0.50727 et 4.0.30319 de Microsoft .NET Framework. La version "1.x" était disponible jusqu'à Oracle Client 11.1. La version "4.x" a été introduite avec Oracle Client 11.2

  • L'architecture (32 bits ou 64 bits) de ODP.NET ne correspond pas à l'architecture de votre application. Une application 32 bits fonctionne uniquement avec Oracle Client / ODP.NET 32 bits, respectivement une application 64 bits nécessite Oracle Client / ODP.NET 64 bits. (Sauf si vous utilisez le pilote géré ODP.NET )

  • La version .NET Framework ne correspond pas. Par exemple, si vous compilez votre application avec Target .NET Framework 2.0, vous ne pouvez pas utiliser ODP.NET version 4.x. La version cible du .NET Framework doit être égale ou supérieure à la version de ODP.NET.

  • La version de Oracle.DataAccess.dllsur votre machine de développement (c'est-à-dire la version qui est chargée lors de la compilation) est supérieure à la version sur la machine cible.

  • Sachez que cela Oracle.DataAccess.dllpeut être chargé à partir de GAC qui par défaut a la priorité sur tout fichier fourni localement.

Solutions

  • Envisagez d'utiliser le pilote géré ODP.NET, il peut être téléchargé à partir de la page Oracle: Téléchargements des composants Oracle Data Access (ODAC) 64 bits . Là, vous n'avez qu'à copier le Oracle.ManagedDataAccess.dllfichier dans le répertoire de votre application, rien d'autre n'est requis. Cela fonctionne à la fois pour 32 bits et 64 bits.

  • Dans votre *.csproj, resp. *.vbprojmodifiez votre référence à ODP.NET comme ceci:

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

    Les attributs tels que Version=...ou processorArchitecture=...ne sont pas obligatoires. Votre application chargera le bon en Oracle.DataAccess.dllfonction de l'architecture sélectionnée et du framework .NET cible (à condition qu'il soit installé correctement) -> non vérifié à 100%

  • Si vous ne connaissez pas la version d'Oracle Client sur la machine cible (par exemple, il peut s'agir de la machine de votre client): Accédez à la page de téléchargement mentionnée ci-dessus et téléchargez la version la moins XCopy d'Oracle Data Access Components. Extrayez le zip et copiez uniquement le Oracle.DataAccess.dllfichier sur votre machine locale. Dans votre projet VS, faites référence à cette DLL (probablement obsolète). La version de cette DLL est la plus petite version d'ODP.NET avec laquelle votre application fonctionnera. Lorsque vous exécutez votre application, la politique de l'éditeur dans GAC redirige vers la version réellement installée.

  • Je ne pense pas que ce soit une approche intelligente de prendre des DLL uniques et de les copier dans certains dossiers. Il peut fonctionner sur une machine "nue", mais si votre machine cible a installé des produits Oracle, il existe un risque élevé de non-concordance de version. Désinstallez tous les produits Oracle de votre machine et effectuez une nouvelle installation. Jetez un œil à Comment désinstaller / supprimer complètement Oracle 11g (client)? il afin d'obtenir une machine vraiment propre.

  • Si vous devez travailler avec des applications 32 bits et 64 bits en même temps, suivez ces instructions pour installer les deux versions sur une seule machine:

Hypothèses: Oracle Home est appelé OraClient11g_home1, la version du client est 11gR2.

  • Supprimez éventuellement tout client Oracle installé

  • Téléchargez et installez Oracle x86 Client, par exemple dans C:\Oracle\11.2\Client_x86

  • Téléchargez et installez le client Oracle x64 dans un dossier différent, par exemple pour C:\Oracle\11.2\Client_x64

  • Ouvrez l'outil de ligne de commande, accédez au dossier% WINDIR% \ System32, généralement C:\Windows\System32et créez un lien symbolique ora112vers le dossier C:\Oracle\11.2\Client_x64(voir ci-dessous)

  • Accédez au dossier% WINDIR% \ SysWOW64, généralement C:\Windows\SysWOW64et créez un lien symbolique ora112vers le dossier C:\Oracle\11.2\Client_x86, (voir ci-dessous)

  • Modifiez la PATHvariable d'environnement, remplacez toutes les entrées comme C:\Oracle\11.2\Client_x86et C:\Oracle\11.2\Client_x64par C:\Windows\System32\ora112, respectivement leur \binsous-dossier. Remarque: C:\Windows\SysWOW64\ora112ne doit pas être dans l'environnement PATH.

  • Si nécessaire, définissez votre ORACLE_HOMEvariable d'environnement surC:\Windows\System32\ora112

  • Ouvrez votre éditeur de registre. Définissez la valeur de registre HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEsurC:\Windows\System32\ora112

  • Définissez la valeur de registre HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOMEsur C:\Windows\System32\ora112(non C:\Windows\SysWOW64\ora112)

  • Vous avez terminé! Vous pouvez maintenant utiliser les clients Oracle x86 et x64 de manière transparente ensemble, c'est-à-dire qu'une application x86 chargera les bibliothèques x86, une application x64 charge les bibliothèques x64 sans autre modification sur votre système.

Commandes pour créer des liens symboliques:

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

Quelques notes:

  • Les deux liens symboliques doivent avoir le même nom, par exemple ora112.

  • Si vous souhaitez installer ODP.NET manuellement par la suite, veillez à sélectionner les dossiers appropriés pour l'installation.

  • Malgré leurs noms, le dossier C:\Windows\System32contient les bibliothèques x64, tandis que les bibliothèques C:\Windows\SysWOW64x86 (32 bits). Ne soyez pas confus.

  • Il est peut-être judicieux de définir votre TNS_ADMINvariable d'environnement (respectivement les TNS_ADMINentrées du registre) à un emplacement commun, par exemple TNS_ADMIN=C:\Oracle\Common\network.

Wernfried Domscheit
la source
Cette OMI a plus de connaissances à retenir que la réponse réelle. Donc, si j'ai une application x86 pour .net 4 et que la version de la base de données est en 9i, quelle version de client un utilisateur doit-il avoir s'il a Windows 32 ou 64 bits? Oracle dit que toute version client est compatible avec n'importe quelle version de base de données. La réponse est-elle avec les utilisateurs 32 bits installant la version 32 bits et les utilisateurs 64 bits installant la version 64 bits et utilisant le pilote géré ODP.NET pour décider à quel système d'exploitation il s'adresse?
Lumineux
1
Lorsque vous utilisez le pilote géré ODP.NET, il n'est pas nécessaire d'installer un client Oracle - c'est le principal avantage de celui-ci. Il fonctionne avec les applications x86 et x64. Sans "ODP.NET Managed Driver", une application x86 nécessite également un client Oracle x86 (c'est-à-dire 32 bits), quelle que soit l'architecture du serveur de base de données.
Wernfried Domscheit
Je viens de tomber sur "Microsoft Visual C ++ 2010 Redistributable doit être installé" - vous devriez l'ajouter à votre résumé.
Jay Sullivan
1
Je ne pense pas que cette erreur soit liée ou causée par Oracle ou ODP.NET
Wernfried Domscheit
Cela fonctionne pour moi, Oracle.DataAccess.dllj'installe à partir du package nuget Oracle.DataAccess.x86, et sa version Dll est 2.112.1.0, donc je fais correspondre l'installation du client Oracle avec la version Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) ICI puis le problème est résolu!
yu yang Jian
6

Après plusieurs heures de dépannage, j'ai trouvé que ce problème était dû à Oracle.DataAccess.dll (v4.0) dans le répertoire bin de mes projets, mais à l'exécution chargeant également Oracle.DataAccess.dll (v2.x) à partir du GAC. La suppression et la lecture de l'entrée Oracle.DataAccess dans les références du projet ont résolu le problème pour moi.

Les autres fichiers mentionnés ici ne semblaient pas nécessaires dans ma situation.

METTRE À JOUR

La cause première de l'erreur «Le fournisseur n'est pas compatible avec la version du client Oracle» est (généralement) que l'assembly géré tente de charger des bibliothèques non gérées qui ne correspondent pas aux versions. Il semble que vous pouvez forcer le pilote Oracle à utiliser les bibliothèques appropriées en spécifiant le chemin de la bibliothèque dans le fichier web.config 1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>
Psaxton
la source
Merci! Votre solution me donne l'idée qui fonctionne après 2 jours (j'ai Visual Studio 2010 Net 4, client Oracle 10g) ... je vois GAC et bien sûr j'ai installé 3 vertions d'Oracle.DataAccess.dll, j'ai tout désinstallé (et supprimez les clés machine.config non valides dans "DbProviderFactories") et réinstallez uniquement ODAC1120320 x64. Et il fonctionne.
Hernaldo Gonzalez
5

installez ODP.Net sur la machine cible et cela devrait résoudre le problème ... copier les dll ne semble pas une bonne idée ...

HainKurt
la source
5

Pour Oracle 11g (11.1.0.7.20), j'ai dû ajouter les dll suivantes avec mon Exe pour fonctionner.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (assez énorme près de 30 Mo)
  4. Oracle.DataAccess.dll
SKG
la source
Vous voulez dire 130 Mo
Elmue
2

Il me semble que bien que vous ayez ODP avec le client Oracle Istant, l'ODP essaie peut-être d'utiliser le client Oracle réel à la place. Un client Oracle standard est-il également installé sur la machine? Je me souviens qu'Oracle était assez pointilleux lorsqu'il s'agissait de plusieurs clients sur la même machine.

Peter Meyer
la source
2

J'ai eu exactement le même problème. J'ai supprimé (et oublié que j'avais supprimé) oraociei11.dll après avoir compilé l'application. Et il donnait cette erreur en essayant d'exécuter. Donc, quand il ne trouve pas la dll qui oraociei11.dll, il affiche cette erreur. Il peut y avoir d'autres cas où il donne cette erreur, mais cela semble être l'un d'entre eux.


la source
2

Recherchez également le pool d'applications IIS Activer l'indicateur vrai ou faux 32 bits, lorsque vous voyez ce message, un forum oracle m'a dirigé pour cela!

Hydtechie
la source
2

J'ai le même problème mais dans mon cas, je ne peux pas simplement copier les dll dans le dossier bin, alors je ne «relire» que la version d'assemblage.

<?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
la source
2

Voici ce que j'ai fait pour résoudre ce problème qui a persisté pendant 3 longues heures:

  1. Sous Oracle home situé à C:\oracle\product\11.2.0j'avais un dossier appelé client_1où j'avais précédemment installé des ODP.NETbits pour Windows 64 bits.

  2. Plus tard, en essayant de déboguer mon application API Web ASP.NET avec Visual Studio 2012, j'ai continué à recevoir ce message d'erreur: Le fournisseur n'est pas compatible avec la version du client Oracle .

  3. En cherchant sur Google, j'ai trouvé que cela se produisait parce que j'utilisais ODP.NET64 bits. Ensuite, j'ai saisi ODP.NETWindows 32 bits et l'ai installé, mais j'ai continué à recevoir le même message d'erreur.

  4. SOLUTION: supprimé le dossier client_1et réinstallé ODP.NET32 bits. Un peu, l'installateur mélangeait des bits de la version 64 bits avec la version 32 bits. Allez comprendre...

  5. Maintenant, je suis à nouveau heureux et je peux ouvrir un nouveau OracleConnection. ENFIN! :)

Leniel Maccaferri
la source
2

Pour toute personne ayant encore ce problème: basé sur cet article

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

J'ai découvert que mon serveur manquait la bibliothèque Microsoft C ++ Visual Runtime - je l'avais sur ma machine de développement en raison de l'installation de Visual Studio. J'ai téléchargé et installé la version (actuellement) la plus récente de la bibliothèque à partir d'ici:

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

Ran la configuration et l'appel oracle de C # l'a fait!

dabor
la source
1
Mec .... Oracle .... pouvons-nous avoir une petite discussion? Viens ici, dans le coin. Écoute mec, j'ai passé toute la journée à comprendre ce que l'enfer "fournisseur non compatible" était censé signifier, pour découvrir plus tard que c'était parce que certaines dépendances d'installation n'étaient pas satisfaites. S'il vous plaît - non - je vous demande de faire vérifier ces dépendances par votre installateur au moment de l'installation et d' avertir l'utilisateur s'il n'est pas satisfait. Merci.
Jay Sullivan
3
En passant, j'ai dû revenir sur cette question de stackoverflow à plusieurs reprises, et une réponse différente s'applique à moi à chaque fois. Quelle perte de temps et d'argent cela a causé.
Jay Sullivan
2

Version TLDR:

  • Utilisez plutôt le fournisseur géré à 100% 12c .
  • Si vous devez utiliser l'ancien fournisseur, vous devez pointer Oracle.DataAccess.dll vers les DLL client Oracle non gérées qui sont de la version correcte. Si vous avez plusieurs clients Oracle installés sur votre machine, cela peut être simple comme inclure la variable de configuration "DllPath" (voir ci-dessous) dans la configuration de votre application, mais vous devrez peut-être également installer un nouveau client oracle vers lequel pointer.

Version complète:

Tout d'abord, assurez-vous que nous comprenons les composants de l'ancien fournisseur non géré (pas le nouveau fournisseur 12c géré à 100%). Il est composé de deux pièces:

  1. le composant .net géré - Oracle.DataAccess.dll
  2. le client non géré (non-.net)

Pour parler simplement, Oracle.DataAccess.dll est presque juste un wrapper, traduisant les instructions .net en instructions ORACLE-NET pour le client non géré.

Cela dit, lorsque vous chargez Oracle.DataAccess, il y a un ordre dans lequel il essaie de localiser les DLL client non gérées dont il a besoin. À partir de la documentation Oracle :

Oracle.DataAccess.dll recherche les DLL non gérées dépendantes (comme Oracle Client) dans l'ordre suivant:

1. répertoire de l'application ou de l'exécutable.

Paramètre 2.DllPath spécifié par la configuration de l'application ou web.config.

Paramètre 3.DllPath spécifié par machine.config.

4.DllPath paramètre spécifié par le registre Windows.

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

5.Répertoires spécifiés par la variable d'environnement Windows PATH.

Donc, dans votre cas, votre application a suivi ce processus ci-dessus et a trouvé un chemin contenant des DLL non gérées qui sont trop anciennes par rapport à l'assembly Oracle.DataAccess.dll que vous utilisez.

Il se peut simplement que la seule installation d'Oracle Client sur cette machine soit trop ancienne. Mais cela entre en jeu si vous avez plus d'un client installé sur la machine et que les fichiers non gérés ont été trouvés en premier dans une installation différente mais plus ancienne. Si le plus tard, la chose simple à faire est d'utiliser la variable de configuration dllPath dans votre configuration et de la pointer vers le bon dossier Oracle Home Bin:

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

Si vous souhaitez installer une nouvelle copie du client, la version xcopy est la plus petite et contient le "client instantané" et pointez le DllPath ci-dessus vers ce nouvel emplacement. Mais toute installation de client Oracle fonctionnera.

Mais si vous souhaitez éviter tout ce problème de résolution de client non géré, voyez si vous pouvez mettre à jour votre application pour utiliser le fournisseur géré à 100% à la place - il ne s'agit en réalité que d'un ou deux assemblys gérés, sans aucune dépendance à des fichiers non gérés.

Il est également possible que vous ne chargiez pas le fichier Oracle.DataAccess.dll que vous pensez être s'il est installé à la fois dans votre répertoire bin et dans votre GAC, mais je pense que c'est le senario le moins probable. Consultez le processus de résolution de l' assembly pour plus d'informations.

b_levitt
la source
1

L'utilisateur IIS / IWAM dispose-t-il d'autorisations sur le répertoire Oracle? Pouvez-vous vous connecter à cette source de données à l'aide d'une autre application, telle qu'Excel ou Access?

DCookie
la source
1

Nous avons eu le même problème, car l'assembly Oracle.Data.dll sur un partage réseau a été mis à jour par nos DBA. La suppression de la référence du projet et son ajout à nouveau résolvait le problème.

Doekman
la source
1

Juste deux étapes pour résoudre ce problème.

  1. allez à la configuration avancée du pool d'applications et définissez l'indicateur «Activer l'application 32 bits» sur True.
  2. Assurez-vous que toutes les DLL de votre corbeille sont maintenant en version 32 bits ...

bonne chance.

Mazhar Abbas
la source
@ mazhar-abbas, pouvez-vous pls. Indiquez dans lequel puis-je définir «Activer l'application 32 bits? Est-ce dans IIS ou Project?
hiFI
1

Je n'ai pas cherché à obtenir de nouvelles DLL. Nous avions un tas de projets existants qui fonctionnaient parfaitement bien et c'était seulement mon nouveau projet qui me donnait mal à la tête, alors j'ai décidé d'essayer autre chose.

Mon projet utilisait un Internal.dll développé en interne qui dépendait d'Oracle.DataAccess.dll v4.112.3.0. Pour une raison quelconque, lors de la publication, Visual Studio est toujours téléchargé v4.121.0.0, même s'il n'a pas été explicitement spécifié dans l'un des fichiers de configuration. C'est pourquoi j'obtenais une erreur.

Donc ce que j'ai fait était:

  1. Copié Internal.dll à partir de l'un des projets en cours d'exécution avec succès sur mon site Web /bin(juste pour être prudent).
  2. Copié Oracle.DataAccess.dll à partir de l'un des projets en cours d'exécution avec succès sur mon site Web /bin.
  3. Ajoutez une référence aux deux depuis mon site Web.
  4. Enfin, la référence Oracle.DataAccess est apparue dans myWebSite.csproj , mais elle a montré la mauvaise version: v4.121.0.0au lieu de v4.112.3.0.
  5. J'ai changé manuellement la référence dans myWebSite.csproj, donc il lit maintenant:

    <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
la source
2
C'est une très mauvaise idée d'ajouter une référence aux dll dans un dossier bin.
Jay Sullivan
1
Les dossiers binet objsont des dossiers de sortie ; c'est là que vont les DLL lorsque vous générez votre projet. Vous devriez pouvoir supprimer ces dossiers à tout moment sans créer de conflit. Habituellement, ces dossiers sont ignorés dans le contrôle de code source. La pratique standard consiste à créer un External Referencesdossier dans lequel vous placez vos dll référencées.
Jay Sullivan
@notfed Vous avez raison. Je garderai cela à l'esprit.
Robotron
Comme il est nommé, il ne s'agit que d'un chemin d' indication pour le compilateur, pas d'une référence de forçage. Tout d'abord, le GAC est recherché pour Oracle.DataAccess.dll. Cela devrait fonctionner même si vous supprimez HintPathentièrement le fichier.
Wernfried Domscheit
1

J'ai rencontré ce problème après avoir installé Oracle Data Tools pour Visual Studio 2015, puis me battre avec Oracle pendant une bonne heure. J'ai décidé d'essayer de réinstaller le client Oracle au lieu de ce désordre avec la copie de fichiers, les modifications de configuration, etc., et cela a fonctionné pour moi.

David Spenard
la source
1

J'ai rencontré un problème similaire et la cause principale était que GAC avait 2 versions oracle.dataaccess, à savoir v4.0_4.112.2.0 et v4.0_4.112.4.0. Mon application faisait référence à la v4.0_4.112.2.0, donc lorsque j'ai supprimé la v4.0_4.112.4.0 de GAC, cela fonctionnait bien.

Chemin d'accès au GAC: C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

Avant : entrez la description de l'image ici

Après : entrez la description de l'image ici

Pour supprimer une version, on peut simplement supprimer le dossier correspondant de GAC.

p4ulinux
la source
0

Récemment, j'ai dû travailler sur un projet plus ancien où la solution et tous les projets contenus étaient destinés à la plate-forme x32. J'ai continué à essayer de copier Oracle.DataAccess.dll et tous les autres fichiers Oracle suggérés à tous les endroits, mais j'ai touché le mur à chaque fois. Enfin l'ampoule dans la tête s'est allumée (après 8 heures :)), et a demandé à vérifier les assemblages ODAC installés et leur plate-forme. J'avais déjà tous les clients ODAC 64 bits (x64) installés, mais pas ceux 32 bits (x32). Installé l'ODAC 32 bits et le problème a disparu.

Comment vérifier la version d'ODAC installé: Regardez dans le dossier C: \ Windows \ assembly. La propriété "Processor Architecture" informera la plate-forme de l'ODAC installé.

Huit heures, c'est long pour que l'ampoule s'allume. Pas étonnant que je doive toujours me battre au travail :).

DiligentKarma
la source
Remarque, C:\Windows\assembliesaffiche simplement les assemblys jusqu'à .NET Framework version 2.0. Les versions 3.x / 4.x ne sont pas affichées, voir stackoverflow.com/questions/28213105/…
Wernfried Domscheit
0

La solution de Chris a également fonctionné pour moi. J'ai cependant reçu un message d'erreur de suivi indiquant:

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.

Apparemment, dans la langue étrangère d'Oraclish, cela signifie que votre programme cible soit toutes les plates-formes, soit des machines 32 bits. Changez simplement votre plate-forme cible dans les propriétés du projet en 64 bits et espérez le meilleur.

Cameron Castillo
la source
3
C'est en fait .NETish, pas Oraclish
Jay Sullivan
0

J'ai eu le même problème avec Oracle.DataAccess.dll v4.121.2.0. avec installation à 2 foyers (versions 32 et 64 bits). Version 32 bits workerd, version 64 bits non.

Dans mon cas (après 2 jours d'essais), j'ai trouvé que le problème était les autorisations sur la version 64 bits de la maison. De nombreux répertoires dans cette version avaient exclusivement des autorisations remplacées où le rôle «Utilisateurs authentifiés» n'avait pas d'accès «Lecture», qui est défini par défaut sur le répertoire parent. Ces sous-répertoires comprenaient "bin", "network / admin", "nls", "oracore", "RDBMS" et peut-être d'autres. Je les ai trouvés en filtrant le résultat "ACCÈS REFUSÉ" dans l'utilitaire "Process Monitor" (Procmon.exe) de sysinternals. Une fois que les autorisations ont été héritées du répertoire parent vers ces sous-répertoires enfants, tout a commencé à fonctionner.

Je n'ai pas quoi remplacer les autorisations sur l'ensemble de la maison oracle, alors je les ai faites un répertoire à la fois, mais je suppose que si vous ne vous souciez pas autant de la sécurité, vous pouvez le réinitialiser sur tout le répertoire de base oracle correspondant.

Greg Z.
la source
-3

Beaucoup de réponses théoriques ici, mais voici un exemple de travail avec du code que vous pouvez copier et coller et tester immédiatement:

  1. J'ai installé la base de données Oracle Express OracleXE112 qui est déjà livrée avec des tables de démonstration préinstallées.
  2. Lorsque vous démarrez le programme d'installation, un mot de passe vous est demandé . J'ai entré "xxx" comme mot de passe. (non utilisé en production)
  3. Mon serveur fonctionne sur la machine 192.168.1.158
  4. Sur le serveur, vous devez autoriser explicitement l'accès au processus TNSLSNR.exe dans le pare-feu Windows . Ce processus écoute sur le port 1521. Si vous obtenez une erreur de délai d'expiration du code ci-dessous, vérifiez votre pare-feu.
  5. OPTION A: Pour C # (.NET2 ou .NET4), vous pouvez télécharger ODAC11 , à partir duquel vous devez ajouter Oracle.DataAccess.dll à votre projet. En outre, cette DLL dépend de: OraOps11w.dll, oci.dll, oraociei11.dll (130 Mo!), Msvcr80.dll. Ces DLL doivent être dans le même répertoire que le fichier EXE ou vous devez indiquer le chemin de DLL dans: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Sur les machines 64 bits, écrivez en plusHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPTION B: Si vous avez téléchargé ODAC12, vous avez besoin d'Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 Mo!), Oraons.dll, msvcr100.dll. Le chemin du registre estHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPTION C: Si vous ne voulez pas d'énormes DLL de plus de 100 Mo, vous devez télécharger ODP.NET_Managed12.xxxxxxxx.zip dans lequel vous trouvez Oracle.ManagedDataAccess.dllqui ne fait que 4 Mo et est une DLL gérée pure qui fonctionne dans les processus 32 bits et 64 bits ainsi et ne dépend d'aucune autre DLL et ne nécessite aucune entrée de registre.
  8. Le code C # suivant fonctionne pour moi sans aucune configuration côté serveur (juste l'installation par défaut):
using Oracle.DataAccess.Client;
ou
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Source de données = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVER = DEDICATED)));"
    + "ID utilisateur = SYSTÈME; Mot de passe = xxx;";

en utilisant (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    en utilisant (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "sélectionnez TABLESPACE_NAME dans DBA_DATA_FILES";

        en utilisant (OracleDataReader dr = cmd.ExecuteReader ())
        {
            tandis que (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}
Elmue
la source
Il est assez excessif d'installer tout le serveur de base de données Oracle lorsque vous avez juste besoin d'un client en cours d'exécution.
Wernfried Domscheit
Vous répondez est pauvre de toute façon. Il n'est pas nécessaire de copier les dll Oracle dans le répertoire de l'application car, par défaut, vous les trouvez via ‰ PATH% (sauf si vous le modifiez vous-même). L'astuce Registy s'applique uniquement à la version 4.x et ne fonctionne que pour le Client Oracle 32 bits. Cependant, les incompatibilités 32 bits et 64 bits sont le sujet principal de cette question.
Wernfried Domscheit
Votre commentaire montre que vous n'avez pas lu ma réponse. Si je veux écrire une application qui communique avec un serveur Oracle, il n'est pas nécessaire d'installer quoi que ce soit à partir d'Oracle. J'utilise juste la DLL mentionnée ci-dessus et la distribue avec mon application. Il n'y aura donc rien dans la variable PATH sur la machine de l'utilisateur final. D'ailleurs, l'utilisation de la variable PATH (qui vient de l'ancien âge DOS de 1980) est fortement déconseillée dans les logiciels modernes. Ma réponse recommande OPTION C qui ne nécessite aucun chemin de registre et ne dépend pas de 32 ou 64 bits. J'ai mentionné les OPTIONS A et B uniquement par souci d'exhaustivité.
Elmue
Je pense que sans un paramètre% PATH% approprié, votre Windows ne fonctionnera pas du tout - même dans la version 10. J'ai mentionné dans ma réponse qu'il n'est pas judicieux de copier manuellement les dll Oracle avec votre application. Je ne connais pas le code source de ces dll mais il peut y avoir plus de dépendances de votre côté client que vous ne voyez pas, par exemple déclenchées par les paramètres de langue, les jeux de caractères, le fuseau horaire, etc. Quand je fais une trace avec Oracle.DataAccess.dllalors le programme charge au total 35 DLL Oracle! Mieux vaut faire une installation normale d'Oracle Client - à moins que vous n'utilisiez le pilote géré ODP.NET, bien sûr.
Wernfried Domscheit
1
Je pense avoir mentionné mes préoccupations: (1) L'installation d'une base de données est inutile, c'est-à-dire une surpuissance. (2) Les options A et B ne fonctionnent que sous certaines conditions, par exemple, elles ne lisent pas les paramètres NLS du registre (pour lesquels vous avez besoin d'un fichier oracle.key). Pour la compatibilité, vous devez également prendre en compte les versions mineures. Oracle.DataAccess, Version=2.112.2.0ne fonctionne pas avec la OraOps11w.dllversion 2.112.4.0 par exemple.
Wernfried Domscheit