2012-04-11 1 views
2

J'essaie d'obtenir une preuve de concept simple en utilisant l'essai de dotConnect for Oracle de Devart parce que nous utilisons actuellement le .Net framework OracleClient (qui doit être abandonné) mais nous avons également besoin d'une connexion sans avoir besoin du client Oracle ou même du client instantané. Pour cette raison, j'essaie de prouver à mon patron que dotConnect est l'outil de travail, étant donné son mode direct et sa capacité à travailler avec Enterprise Library 5 (utilisé dans notre couche d'accès aux données). J'ai suivi les exemples fournis par Devart, y compris l'ajout de la carte de fournisseur personnalisé dans le app.config dans une application de test. Tout semblait fonctionner sur ma machine de développement à la fois dans l'IDe et en tant qu'application compilée, donc je l'ai enveloppé dans un simple projet d'installation et de déploiement, construit un msi puis l'ai installé sur une machine virtuelle Win7 x86 ne pas avoir installé le client Oracle pour le tester.Devlet dotConnect pour les mappages de fournisseurs personnalisés Oracle et Enterprise Library

Il ne veut tout simplement pas fonctionner. Le test exécute une instruction select simple et affiche les résultats dans un listview (s'il y en a un, vous obtenez un message si ce n'est pas le cas). Je ne suis pas vraiment préoccupé par les résultats eux-mêmes, simplement le fait de les obtenir. Le problème est quand j'exécute le test, je reçois l'erreur EL jamais inutile:

Activation error occured while trying to get instance of type Database, key "Testing26_devart" 

Voici la ligne incriminée de code:

Dim db As Database = EnterpriseLibraryContainer.Current.GetInstance(Of Database)(EnvironmentName) 

Voici le mappage de fournisseur dans le fichier app.config:

<add databaseType="Devart.Data.Oracle.EnterpriseLibrary.OracleDatabase, Devart.Data.Oracle.EnterpriseLibrary, Version=3.5.4456.40828, Culture=neutral, PublicKeyToken=null" name="Devart.Data.Oracle" /> 

est ici la chaîne de connexion de la app.config:

<add name="Testing26_devart" connectionString="User Id=Testing26;Password=Testing26;Server=ORACLE-SERVER;Direct=True;Sid=DEVORA;Port=1523;" 
     providerName="Devart.Data.Oracle" /> 

Je sais que cette erreur peut être provoquée en utilisant le mauvais nom de chaîne de connexion (entre autres choses), mais je sais que c'est correct parce que je le récupère du fichier de configuration en premier lieu. Aussi, c'est exactement la même chose que la configuration utilisée dans l'environnement de développement. L'exception intérieure est la suivante:

Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "Testing26_devart". 

Exception occurred while: while resolving. 

Exception is: InvalidOperationException - The type Database cannot be constructed. You must configure the container to supply this value. 

Je soupçonne que la cartographie des fournisseurs est à blâmer parce que si je change le fournisseur dans la chaîne de connexion à System.Data.OracleClient il n'a pas de problème du tout trouver la chaîne de connexion, mais se plaint plutôt de la non prise en charge mot-clé Direct (à partir du commutateur de mode direct dotConnect), ce qui est logique.

Je ne vois pas ce que j'ai fait de mal en ce qui concerne la cartographie du fournisseur. Je ne l'ai pas utilisé auparavant mais j'ai utilisé l'outil de configuration EL pour assurer sa correcte, la bibliothèque personnalisée est incluse avec l'exécutable (et les autres bibliothèques EL). J'ai regardé plusieurs exemples, qui tous suggèrent que j'ai la bonne configuration, alors qu'est-ce qui me manque? Ça me rend dingue.

Répondre

2

Il semble que DbProviderFactory ne soit pas configuré. Il est probable que lorsque vous installez le logiciel Devart, il installe DbProviderFactory dans le fichier machine.config. Vérifiez le fichier machine.config sur votre machine de développement pour l'existence de DbProviderFactory.

Si vous ne souhaitez pas modifier machine.config, vous pouvez ajouter les informations de configuration à votre app.config. Il ressemblerait à quelque chose comme:

<system.data> 
    <DbProviderFactories> 
     <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" 
description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle" />   
    </DbProviderFactories> 
    </system.data> 

Je ne suis pas familier avec les bibliothèques DevArt donc je ne suis pas sûr de ce que la version ou PublicKeyToken seraient.

Si la bibliothèque d'entreprise ne peut pas localiser DbProviderFactory, la base de données ne sera pas enregistrée et lorsque vous essayez d'accéder à la base de données, le message indiquant que l'objet est introuvable dans le conteneur s'affiche.

+0

Vous étiez sur place - le programme d'installation pour dotConnect ajoute l'entrée à la machine.config mais ne mentionne nulle part dans la documentation (que je peux voir), d'où il fonctionne parfaitement sur la machine de développement. Dès que j'ai ajouté la section à mon app.config il a éclaté dans la vie et a fait exactement ce que je m'y attendais. Merci beaucoup - J'ai passé 2 jours à essayer de trouver ce qui n'allait pas en utilisant des trucs comme fuslogvw, le moniteur de processus et plus encore. –

+0

@StevePettifer, il semble que vous n'avez pas fait attention à cet article dans la documentation du produit: http://www.devart.com/dotconnect/oracle/docs/Deployment.html. Vous pouvez trouver toutes les informations dont vous avez besoin. – Devart

+0

@Devart - J'ai lu ce document mais il n'est pas clair que vous en ayez besoin lorsque vous utilisez les nouvelles méthodes EL5 pour obtenir des instances de base de données qui (comme il s'avère) font considérablement abstraction de DbProviderFactories sauf si vous le savez déjà. Ne dit pas non plus que votre installateur l'ajoute à machine.config qui était l'omission de clé. Je vous suggère de ne pas ajouter l'entrée DbProviderFactories dans le fichier machine.config lors de l'installation et de préciser dans la documentation qu'il doit être ajouté à app.config/web.config (ou, si c'est ce que l'utilisateur souhaite, machine.config) manuellement. –

Questions connexes