170 votes

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

Je tente d'utiliser l' Oracle ODP.NET 11g (11.1.0.6.20) Instant Client sur mon projet ASP.net en tant que fournisseur de données, mais lorsque j'exécute la page aspx, je reçois un message d'erreur "Le fournisseur n'est pas compatible avec la version 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();

//Faire quelque chose

oOracleConn.Close();

L'erreur sur la page ressemble à ceci:

Détails de l'exception: Oracle.DataAccess.Client.OracleException: Le fournisseur n'est pas compatible avec la version du client Oracle

Source de l'erreur:
Ligne 21: 
Ligne 22: 
Ligne 23:             OracleConnection oOracleConn = new OracleConnection();
Ligne 24:             oOracleConn.ConnectionString =
Ligne 25:                 "Data Source=MyOracleServerName;" +

[OracleException (0x80004005): Le fournisseur n'est pas compatible avec la version du client Oracle]
   Oracle.DataAccess.Client.OracleInit.Initialize() +494
   Oracle.DataAccess.Client.OracleConnection..cctor() +483

Trace de la pile:
[TypeInitializationException: L'initialiseur de type pour 'Oracle.DataAccess.Client.OracleConnection' a levé une exception.]
   Oracle.DataAccess.Client.OracleConnection..ctor() +0
   Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) dans 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

95voto

Chris Points 13472

J'ai étudié plus en profondeur ce problème, et il vous suffit simplement de récupérer tous les DLL appropriés de la même version téléchargée d'ODP.Net et de les placer dans le même dossier que votre fichier Exe, car ODP.Net est pointilleux sur le fait de ne pas mélanger les numéros de version.

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

  • Télécharger ODP.Net
  • Dézipper le fichier
  • Dézipper tous les JAR qui s'y trouvent
  • Récupérer ces DLL qui viennent d'être dézippés :
    • oci.dll (renommer à partir de 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (renommer à partir de 'ociw32.dll.dbl')
  • Placer tous les DLL dans le même dossier que votre Exécutable C#

4 votes

Votre solution a fonctionné pour moi - j'ai trouvé votre article de blog avant de trouver cela. Vous êtes l'homme. Merci ! :-) De plus, en utilisant la dernière version de l'ODAC, je n'ai pas eu besoin de décompresser des JARs... les fichiers .dll étaient situés dans différents répertoires de mon oracle home. Une simple recherche dans Windows les a rapidement trouvés.

10 votes

Aussi, j'utilisais la dernière version de l'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 le souligne Chris, ASSUREZ-VOUS QU'ILS SE TROUVENT DANS LE MÊME DOSSIER QUE VOTRE EXÉCUTABLE. ;-)

1 votes

Cela semble que la nouvelle version rend plus facile de trouver les dll. Génial! Maintenant, combien de temps avant qu'oracle les regroupe en un seul dll simple...

52voto

Tod Thomson Points 1145

Vous devriez "ignorer" toute la discussion sur x86/x64 ici pour commencer et essayer plutôt 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/

Oracle ODP.net Managed vs Unmanaged Driver

Évitez tous les problèmes liés aux "non gérés" et à l'architecture des DLL! :D (il était temps, Oracle).

Le package NuGet (fonctionne aussi pour 11g):

entrez la description de l'image ici

L'ancienne méthode / manuelle:

Pour des informations sur comment passer à l'utilisation des bibliothèques gérées:

  • Tout d'abord, voici une excellente comparaison de code entre les versions gérées et non gérées: http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Assurez-vous d'avoir téléchargé uniquement la version Xcopy du pilote Oracle ODP.NET, Managed Driver
  • À partir du fichier zip téléchargé, copiez et collez dans le répertoire de votre projet:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Ajoutez 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

3 votes

C'est une bonne nouvelle qu'Oracle a enfin un pilote entièrement géré. Transporter ce fichier dll de 100 Mo a été un véritable fardeau.

1 votes

Le pilote géré fonctionne très bien pour moi - je n'ai eu aucun problème depuis que j'ai commencé à l'utiliser / vous pouvez réinitialiser vos projets en AnyCPU, etc. et cela fonctionne très bien :)

5 votes

Juste pour que tout le monde en soit conscient, bien que le fournisseur géré soit agréable, il manque de nombreuses fonctionnalités que permet le fournisseur complet. Notamment, le cryptage intégré d'Oracle.

37voto

EverTheLearner Points 1517

J'ai seulement installé le Oracle Data Provider for .NET 2.0 (11.1.0.6.20) et je n'ai pas installé l'Oracle Instant Client (11.1.0.6.0).

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

4 votes

Pouvez-vous simplement copier les 4 fichiers 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)

3 votes

@Chris: Oui, vous le pouvez. Dans mon expérience, cependant, vous avez besoin de oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll et oracle.dataaccess.dll

1 votes

Le sens inverse pour moi - j'avais installé le client, mais pas le fournisseur

33voto

Daniel Points 245

Cela peut être causé par l'exécution d'un runtime .NET 64 bits contre un client Oracle 32 bits. Cela peut se produire si votre serveur sur lequel vous exécutez l'application est en 64 bits. Il exécutera l'application .NET avec le runtime 64 bits. Vous pouvez définir le drapeau CPU sur votre projet dans VS pour l'exécuter avec le runtime 32 bits.

0 votes

Je viens de rencontrer ce problème. Cela fonctionnait dans une application de test en (32 bits), puis cela a planté dans IIS. Plutôt que d'exiger que toutes les assemblies impliquées soient en 32 bits, j'ai changé pour un 32-bit AppPool.

29voto

Wernfried Points 2508

Faisons une sorte de résumé :

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

  • Vous n'avez pas de client Oracle installé. Dans ce cas, le message d'erreur est en effet trompeur.

    Oracle Data Provider for .NET (ODP.NET, c'est-à-dire le fichier) Oracle.DataAccess.dll ) n'est pas inclus dans Oracle Instant Client, il doit être installé séparément (à télécharger à l'adresse suivante Composants Oracle Data Access (ODAC) 32 bits ou Téléchargements Oracle Data Access Components (ODAC) 64 bits ) ou vous devez sélectionner l'option correspondante dans Oracle Universal Installer (OUI).

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

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

    Attention aux différents systèmes de numérotation. Version du fichier 4.112.3.0 signifie : .NET Framework Version 4, Oracle Release 11.2.0.3.x .

    Il existe des versions ODP.NET "1.x", "2.x" et "4.x". Ces numéros 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'à la version 11.1 du client Oracle. La version "4.x" a été introduite avec le client Oracle 11.2.

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

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

  • La version de Oracle.DataAccess.dll sur 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 Oracle.DataAccess.dll peut être chargé à partir de CAG qui, par défaut, est prioritaire sur tout fichier fourni localement.

Solutions

  • Pensez à utiliser le pilote géré ODP.NET, il peut être téléchargé depuis la page Oracle : Téléchargements Oracle Data Access Components (ODAC) 64 bits . Là, il suffit de copier Oracle.ManagedDataAccess.dll dans le répertoire de votre application, rien d'autre n'est requis. Il fonctionne à la fois pour 32bit et 64bit.

  • Dans votre *.csproj , resp. *.vbproj modifiez votre référence à ODP.NET comme suit :

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

    Des attributs comme Version=... ou processorArchitecture=... ne sont pas nécessaires. Votre application chargera le bon Oracle.DataAccess.dll en fonction de l'architecture sélectionnée et du framework .NET cible (à condition qu'il soit correctement installé) -> non vérifié à 100

  • Si vous ne connaissez pas la version du client Oracle sur la machine cible (par exemple, il peut s'agir de la machine de votre client) : Allez à la page de téléchargement mentionnée ci-dessus et téléchargez la moins XCopy version d'Oracle Data Access Components. Extrayez le zip et copiez juste le Oracle.DataAccess.dll sur votre machine locale. Dans votre projet VS, faites une référence à cette DLL (très probablement périmée). La version de cette DLL est la plus petite version d'ODP.NET avec laquelle votre application fonctionnera. Lorsque vous exécuterez votre application, la stratégie de publication dans le GAC redirigera 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. Cela peut fonctionner sur une machine "nue", mais si votre machine cible a installé des produits Oracle, le risque d'incompatibilité de version est élevé. Désinstallez tous les produits Oracle de votre machine et faites une nouvelle installation. Jetez un coup d'œil à Comment désinstaller / supprimer complètement Oracle 11g (client) ? afin d'obtenir une machine vraiment propre.

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

Hypothèses : Oracle Home s'appelle OraClient11g_home1 La version du client est 11gR2.

  • Suppression facultative de tout client Oracle installé

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

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

  • Ouvrez l'outil de ligne de commande, allez dans le dossier %WINDIR%. \System32 en général C:\Windows\System32 et créer un lien symbolique ora112 vers le dossier C:\Oracle\11.2\Client_x64 (voir ci-dessous)

  • Passez dans le dossier %WINDIR%. \SysWOW64 en général C:\Windows\SysWOW64 et créer un lien symbolique ora112 vers le dossier C:\Oracle\11.2\Client_x86 (voir ci-dessous)

  • Modifiez le PATH remplacez toutes les entrées comme C:\Oracle\11.2\Client_x86 et C:\Oracle\11.2\Client_x64 par C:\Windows\System32\ora112 , leurs \bin sous-dossier. Note : C:\Windows\SysWOW64\ora112 ne doit pas être dans l'environnement PATH.

  • Si nécessaire, réglez votre ORACLE_HOME à la variable d'environnement C:\Windows\System32\ora112

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

  • Définir la valeur du registre HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME à C:\Windows\System32\ora112 (pas C:\Windows\SysWOW64\ora112 )

  • Vous avez terminé ! Maintenant vous pouvez utiliser les clients Oracle x86 et x64 sans problème, c'est-à-dire qu'une application x86 chargera les bibliothèques x86, une application x64 chargera les bibliothèques x64 sans aucune autre modification sur votre système.

Commandes permettant de 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, prenez soin de sélectionner les dossiers appropriés pour l'installation.

  • Malgré leurs noms de dossier C:\Windows\System32 contient les bibliothèques x64, tandis que C:\Windows\SysWOW64 contient les bibliothèques x86 (32 bits). Ne vous méprenez pas.

  • C'est peut-être une option judicieuse de définir votre TNS_ADMIN variable d'environnement (resp. TNS_ADMIN dans le Registre) vers un emplacement commun, par exemple TNS_ADMIN=C:\Oracle\Common\network .

0 votes

Ce IMO a plus de connaissances à emporter 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 aurait-il besoin d'avoir s'il a Windows 32 ou 64 bits? Oracle dit que n'importe quelle version de client est compatible avec n'importe quelle version de base de données. La réponse est que les utilisateurs 32 bits installent la version 32 bits et les utilisateurs 64 bits installent la version 64 bits et utilisent le pilote géré ODP.NET pour décider à quel système d'exploitation il parle.

2 votes

Lorsque vous utilisez le pilote ODP.NET Managed, il n'est pas nécessaire d'installer un client Oracle - c'est le principal avantage. Il fonctionne avec les applications x86 et x64. Sans le "pilote ODP.NET Managed", une application x86 nécessite également un client Oracle x86 (c'est-à-dire 32 bits), peu importe l'architecture du serveur de base de données.

0 votes

Je viens de rencontrer "Microsoft Visual C++ 2010 Redistributable doit être installé" - vous devriez ajouter cela à votre résumé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X