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
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):
La méthode ancienne / manuelle:
Pour plus d'informations sur la conversion à l'utilisation des bibliothèques gérées :
la source
readme
qui décrit certaines limitations.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!
la source
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.
la source
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.dll
version 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 suroraociei*.dll
et / ouOraOps*w.dll
pour 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.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 cela
Oracle.DataAccess.dll
peut ê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.dll
fichier 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.*.vbproj
modifiez votre référence à ODP.NET comme ceci:Les attributs tels que
Version=...
ouprocessorArchitecture=...
ne sont pas obligatoires.Votre application chargera le bon en-> non vérifié à 100%Oracle.DataAccess.dll
fonction de l'architecture sélectionnée et du framework .NET cible (à condition qu'il soit installé correctement)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.dll
fichier 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\System32
et créez un lien symboliqueora112
vers le dossierC:\Oracle\11.2\Client_x64
(voir ci-dessous)Accédez au dossier% WINDIR% \ SysWOW64, généralement
C:\Windows\SysWOW64
et créez un lien symboliqueora112
vers le dossierC:\Oracle\11.2\Client_x86
, (voir ci-dessous)Modifiez la
PATH
variable d'environnement, remplacez toutes les entrées commeC:\Oracle\11.2\Client_x86
etC:\Oracle\11.2\Client_x64
parC:\Windows\System32\ora112
, respectivement leur\bin
sous-dossier. Remarque:C:\Windows\SysWOW64\ora112
ne doit pas être dans l'environnement PATH.Si nécessaire, définissez votre
ORACLE_HOME
variable d'environnement surC:\Windows\System32\ora112
Ouvrez votre éditeur de registre. Définissez la valeur de registre
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
surC:\Windows\System32\ora112
Définissez la valeur de registre
HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
surC:\Windows\System32\ora112
(nonC:\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:
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\System32
contient les bibliothèques x64, tandis que les bibliothèquesC:\Windows\SysWOW64
x86 (32 bits). Ne soyez pas confus.Il est peut-être judicieux de définir votre
TNS_ADMIN
variable d'environnement (respectivement lesTNS_ADMIN
entrées du registre) à un emplacement commun, par exempleTNS_ADMIN=C:\Oracle\Common\network
.la source
Oracle.DataAccess.dll
j'installe à partir du package nugetOracle.DataAccess.x86
, et sa version Dll est2.112.1.0
, donc je fais correspondre l'installation du client Oracle avec la versionOracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64)
ICI puis le problème est résolu!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
la source
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 ...
la source
Pour Oracle 11g (11.1.0.7.20), j'ai dû ajouter les dll suivantes avec mon Exe pour fonctionner.
la source
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.
la source
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
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!
la source
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.
la source
Voici ce que j'ai fait pour résoudre ce problème qui a persisté pendant 3 longues heures:
Sous Oracle home situé à
C:\oracle\product\11.2.0
j'avais un dossier appeléclient_1
où j'avais précédemment installé desODP.NET
bits pour Windows 64 bits.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 .
En cherchant sur Google, j'ai trouvé que cela se produisait parce que j'utilisais
ODP.NET
64 bits. Ensuite, j'ai saisiODP.NET
Windows 32 bits et l'ai installé, mais j'ai continué à recevoir le même message d'erreur.SOLUTION: supprimé le dossier
client_1
et réinstalléODP.NET
32 bits. Un peu, l'installateur mélangeait des bits de la version 64 bits avec la version 32 bits. Allez comprendre...Maintenant, je suis à nouveau heureux et je peux ouvrir un nouveau
OracleConnection
. ENFIN! :)la source
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!
la source
Version TLDR:
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:
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 :
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:
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.
la source
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?
la source
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.
la source
Juste deux étapes pour résoudre ce problème.
bonne chance.
la source
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:
/bin
(juste pour être prudent)./bin
.myWebSite.csproj
, mais elle a montré la mauvaise version:v4.121.0.0
au lieu dev4.112.3.0
.J'ai changé manuellement la référence dans
myWebSite.csproj
, donc il lit maintenant:la source
bin
etobj
sont 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 unExternal References
dossier dans lequel vous placez vos dll référencées.HintPath
entièrement le fichier.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.
la source
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 :
Après :
Pour supprimer une version, on peut simplement supprimer le dossier correspondant de GAC.
la source
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 :).
la source
C:\Windows\assemblies
affiche 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/…La solution de Chris a également fonctionné pour moi. J'ai cependant reçu un message d'erreur de suivi indiquant:
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.
la source
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.
la source
http://randomdevtips.blogspot.com/2012/06/provider-is-not-compatible-with-version.html
la source
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:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
. Sur les machines 64 bits, écrivez en plusHKLM\SOFTWARE\Wow6432Node\Oracle\...
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
Oracle.ManagedDataAccess.dll
qui 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.la source
Oracle.DataAccess.dll
alors 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.oracle.key
). Pour la compatibilité, vous devez également prendre en compte les versions mineures.Oracle.DataAccess, Version=2.112.2.0
ne fonctionne pas avec laOraOps11w.dll
version 2.112.4.0 par exemple.