web-dev-qa-db-fra.com

L'initialiseur de type pour 'Oracle.DataAccess.Client.OracleConnection' a levé une exception

J'ai développé une application qui utilise Oracle Data Provider pour .NET. Je copie le fichier d'application (.exe) et la bibliothèque ODP (Oracle.DataAccess.dll) sur un autre ordinateur sur lequel le client Oracle et ODP.NET ne sont PAS installés. Lorsque j'ai exécuté l'application, j'ai reçu le message d'erreur: l'initialiseur de type pour 'Oracle.DataAccess.Client.OracleConnection' a levé une exception.

*****************Exception Text***************
System.TypeInitializationException: The type initlializer for 'Oracle.DataAccess.Client.OracleConnection at Oracle.DataAccess.Client.OracleConnection..cctor()
  --- End of inner exception stack trace ---
  at Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)
  ...

Dois-je installer ODP.NET et le client Oracle sur l'ordinateur sur lequel je souhaite exécuter mon application? Si oui, existe-t-il un autre moyen pour que je n'aie pas à les installer mais que je puisse quand même exécuter mon application?

Je vous remercie

16
Sambath Prum

Moyen le plus simple !!!

  1. Faites un clic droit sur le projet et sélectionnez " Gérer les packages NuGet ..."
  2. Recherchez Oracle.ManagedDataAccess. Installez-le.

Si vous utilisez Entity Framework et votre Visual Studio La version est 2012 ou supérieure, alors

  1. Recherchez à nouveau Oracle.ManagedDataAccess.EntityFramework. Installez-le.
  2. Utilisez les espaces de noms ci-dessous dans votre fichier .cs:
    utilisant Oracle.ManagedDataAccess.Client;
    à l'aide d'Oracle.ManagedDataAccess.EntityFramework;

C'est fait. Redémarrez maintenant votre studio visuel et créez votre code.

Que font ces packages?
Après l'installation de ces packages, aucun logiciel client Oracle supplémentaire n'est requis pour être connecté à la base de données.

7
Hitsa

Oracle Data Provider for .NET (d'Oracle) et .NET Framework Data Provider for Oracle (de Microsoft) nécessitent Oracle Client installé sur la machine.

6
Aleris

D'accord, quand vous savez avec certitude que d'autres applications utilisant le même processus ont fonctionné; sur votre nouvelle application assurez-vous d'avoir la référence d'accès aux données et les trois fichiers dll ...

J'ai téléchargé ODAC1120320Xcopy_32bit sur le site Oracle:

http://www.Oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html

Référence: Oracle.DataAccess.dll (ODAC1120320Xcopy_32bit\odp.net4\odp.net\bin\4\Oracle.DataAccess.dll)

Incluez ces 3 fichiers dans votre projet:

  • oci.dll (ODAC1120320Xcopy_32bit\instantclient_11_2\oci.dll)
  • oraociei11.dll (ODAC1120320Xcopy_32bit\instantclient_11_2\oraociei11.dll)
  • OraOps11w.dll (ODAC1120320Xcopy_32bit\odp.net4\bin\OraOps11w.dll)

Lorsque j'essayais de créer une autre application avec la référence et les fichiers corrects, je recevais ce message d'erreur.

Le correctif: a mis en évidence les trois fichiers et sélectionné "Copier vers la sortie" = Copier si plus récent. J'ai copié si plus récent car l'une des DLL est supérieure à 100 Mo et les mises à jour que je fais ne recopieront pas ces fichiers.

J'ai également rencontré une erreur de registre, cela l'a corrigé.

public void updateRegistryForOracleNLS()
{
    RegistryKey Oracle = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Oracle");
    Oracle.SetValue("NLS_LANG", "AMERICAN_AMERICA.WE8MSWIN1252");
}

Pour la liste Oracle nls_lang, consultez ce site: https://docs.Oracle.com/html/B13804_02/gblsupp.htm

Après cela, tout s'est bien passé.

J'espère que ça aide.

6
Andrew Grinder

Essayez d'utiliser Oracle.ManagedDataAccess.dll

Vous pouvez l'obtenir sur NuGet (recherchez 'Oracle managed') ou téléchargez ODP.NET_Managed.Zip (le lien est vers une version bêta, mais vous pointe dans la bonne direction)

J'utilise ceci pour que les ordinateurs sur lesquels je déploie ne nécessitent pas l'installation d'un client Oracle. N.B. à mon avis, c'est bon pour les applications console mais ennuyeux si vous avez l'intention d'installer votre application.

4
ono2012

Il s'agit d'une question ancienne, mais toujours pertinente, et bien que les réponses ici soient utiles, aucune réponse n'a répondu pleinement aux deux questions du PO.

1. Dois-je installer ODP.NET et le client Oracle sur l'ordinateur sur lequel je veux exécuter mon application?

[~ # ~] oui [~ # ~] - si vous utilisez ODP.NET, Non géré . Il s'agit de la version que vous installez généralement lorsque vous choisissez "Oracle Data Provider for .NET" dans le programme d'installation d'Oracle Client (par exemple). Vous téléchargez ceci depuis Oracle (il suffit de google: les URL Oracle changent souvent).

Mais si vous utilisez ODP.NET, géré (et vous voulez probablement utiliser celui-ci à la place), alors non, vous devez uniquement installer (ou déployer) ODP.NET, géré avec l'application, pas le client Oracle complet. Voir ci-dessous pour plus de détails.

2. Si oui, existe-t-il un autre moyen pour que je ne doive pas les installer mais que je puisse quand même exécuter mon application?

Oui, il y a au moins un moyen. Et c'est le port géré d'ODP.NET.

Malheureusement, les solutions de contournement habituelles, y compris ODBC, le fournisseur Oracle de Microsoft pour .NET (oui, cet ancien obsolète) et ODP.NET, Unmanaged DLL nécessitent toutes que le client Oracle soit installé. Ce n'est que lorsque nos amis d'Oracle nous ont donné un joli petit (~ 5 Mo) DLL qui est également géré. Cela signifie qu'il n'est plus nécessaire de repousser les versions 32 bits et 64 bits pour aller avec les clients Oracle 32 bits et 64 bits! Et plus de problèmes avec la liaison d'assemblage où vous construisez avec 10.0.2.1 (ou autre), mais vos clients installent une gamme de clients de 9i à 12c, y compris le 'g' ceux du milieu), car vous pouvez simplement l'envoyer avec votre application et le gérer via nuget.

Mais si vous utilisez ODP.NET, Managed qui est disponible en tant que package nuget, vous n'avez pas besoin d'installer le client Oracle. Vous n'avez besoin que du ODP.NET, DLL gérée. Et si vous utilisiez auparavant ODP.NET, DLL non managée, il est très facile de changer: changez simplement toutes vos références au Managed ODP.NET (fichiers .csproj dans csharp, etc.), puis modifiez tout using instructions, par exemple: using Oracle.DataAccess.Client devient using Oracle.ManagedDataAccess.Client et c'est tout! (À moins que vous n'utilisiez soi-disant certaines des fonctionnalités de gestion de base de données les plus avancées du client complet qui sont exposées dans ODP.NET, Unmanaged, ce que je n'ai pas fait moi-même, alors bonne chance avec ça ..). Et aussi neutraliser tous ces nœuds assemblyBindingRedirect ennuyeux de votre app.config/web.config fichiers et ne transpirez plus jamais!

Les références:

Dépannage:

Cette erreur signifie généralement que ODP.NET a été trouvé OK, mais que le client Oracle n'a pas été trouvé ou n'est pas installé. Cela peut également se produire lorsque l'architecture ne correspond pas (le client Oracle 32 bits est installé, mais essaie d'utiliser ODP.NET 64 bits non géré, ou vice versa). Cela peut également se produire en raison de problèmes d'autorisations et de chemin d'accès et d'autres problèmes avec le domaine d'application (votre application Web ou votre EXE ou autre) ne pouvant pas trouver les DLL Oracle pour communiquer réellement avec Oracle sur le réseau (ODP.NET Unmanaged Les DLL sont simplement des wrappers pour cela qui se connectent à ADO et autres).

Solutions courantes que j'ai trouvées à ce problème:

L'application est en 64 bits?

  • Installer le client Oracle 64 bits (un 32 bits ne fonctionnera pas)

L'application est 32 bits?

  • Installer le client Oracle 32 bits (celui 64 bits ne fonctionnera pas)

Oracle Client est déjà installé pour la bonne architecture?

  • Vérifiez votre environnement PATH et Oracle_HOME variables, assurez-vous que Oracle peut être trouvé (les versions plus récentes peuvent utiliser Registry à la place)
  • Vérifiez l'Oracle_HOME et les paramètres dans le Registre (Et n'oubliez pas: Le Registre est soit 32 bits soit 64 bits, alors assurez-vous de vérifier celui qui correspond à votre application!)
  • Vérifiez les autorisations sur le Oracle_HOME dossier. Si vous ne savez pas où cela se trouve, consultez le Registre. J'ai vu des cas où le processus de travail d'application ASP.NET utilisait un utilisateur du service réseau et pour une raison quelconque, l'installation côte à côte de clients 32 bits et 64 bits a entraîné la suppression des autorisations du premier client pour le Authorized Users group .. fixant les perms sur le dossier personnel a corrigé ce problème.
  • Comme toujours, il est pratique d'utiliser SysInternals Process Monitor pour savoir quel fichier est manquant ou ne peut pas être lu.
1
nothingisnecessary

Vous devez installer le pilote client Oracle pour que ces classes fonctionnent.

Il peut y avoir des frameworks de connexion tiers qui peuvent gérer Oracle, peut-être que quelqu'un d'autre en connaît peut-être certains.

1
tuinstoel