2012-04-11 12 views
2

Ich versuche, einen einfachen Proof-of-Concept mit der Testversion von Devarts dotConnect for Oracle zu erhalten, da wir derzeit das .Net-Framework OracleClient verwenden (wegen veraltet). aber wir müssen auch eine Verbindung herstellen, ohne den Oracle Client oder sogar den Instant Client zu benötigen. Aus diesem Grund versuche ich meinem Chef zu beweisen, dass dotConnect das Werkzeug für den Job ist, da es direkt arbeitet und mit Enterprise Library 5 arbeiten kann (in unserer Datenzugriffsschicht). Ich folgte den von Devart bereitgestellten Beispielen, einschließlich des Hinzufügens der benutzerdefinierten Anbieterzuordnung in der app.config in einer Test-App. Dies alles schien auf meiner Entwicklungsmaschine sowohl in der IDe als auch als kompilierte Anwendung zu funktionieren, also wickelte ich es in ein einfaches Setup- und Bereitstellungsprojekt ein, erstellte eine MSI und installierte sie dann auf einer virtuellen Win 7 x86 virtuellen Maschine, die dies nicht tut nicht den Oracle Client installiert haben, um es zu testen.Devart dotConnect für Oracle- und Enterprise-Bibliothek Benutzerdefinierte Provider-Zuordnungen

Es will einfach nicht funktionieren. Der Test führt eine einfache SELECT-Anweisung aus und zeigt die Ergebnisse in einer Listenansicht an (falls vorhanden, erhalten Sie eine Nachricht, falls dies nicht der Fall ist). Ich kümmere mich eigentlich nicht um die Ergebnisse selbst, sondern nur darum, sie zu bekommen. Das Problem ist, wenn ich den Test ausführen ich das jemals nicht hilfreich EL Fehler:

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

Hier ist die problematische Codezeile:

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

Hier ist die Provider-Zuordnung in der Datei 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" /> 

Hier ist die Verbindungszeichenfolge aus der 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" /> 

Ich weiß, dass dieser Fehler durch die Verwendung des falschen Verbindungszeichenfolgennamens (unter anderem) verursacht werden kann, aber ich weiß, dass dies korrekt ist, weil ich es von der Konfigurationsdatei an erster Stelle abrufe. Dies ist genau dasselbe wie die Konfiguration in der Entwicklungsumgebung. Die innere Ausnahme ist dies:

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. 

Ich vermute, dass der Provider-Mapping weil schuld ist, wenn ich den Anbieter in der Verbindungszeichenfolge System.Data.OracleClient dann ändern hat es kein Problem überhaupt die Verbindungszeichenfolge zu finden, sondern beschwert sich über die nicht unterstützte Stichwort Direct (von der DotConnect Direct-Modus-Schalter), die Sinn macht.

Ich kann nicht sehen, was ich in Bezug auf das Provider Mapping falsch gemacht habe. Ich habe es vorher nicht benutzt, aber ich habe das EL-Konfigurationstool verwendet, um sicherzustellen, dass es korrekt ist. Die benutzerdefinierte Bibliothek ist in der ausführbaren Datei (und den anderen EL-Bibliotheken) enthalten. Ich habe mir einige Beispiele angeschaut, die alle darauf hindeuten, dass ich die richtige Konfiguration habe. Was also fehlt mir? Das macht mich verrückt.

Antwort

2

Es klingt wie die DbProviderFactory nicht konfiguriert ist. Wahrscheinlich wird beim Installieren der Devart-Software die DbProviderFactory in der machine.config installiert. Überprüfen Sie die machine.config auf Ihrem Entwicklungscomputer auf das Vorhandensein der DbProviderFactory.

Wenn Sie die Datei machine.config nicht ändern möchten, können Sie die Konfigurationsinformationen zu Ihrer app.config hinzufügen. Es wäre in etwa so aussehen:

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

ich mit den Devart Bibliotheken nicht vertraut bin, damit ich bin nicht sicher, was die Version oder PublicKeyToken wäre.

Wenn die Enterprise Library die DbProviderFactory nicht finden kann, wird die Datenbank nicht registriert. Wenn Sie versuchen, auf die Datenbank zuzugreifen, erhalten Sie die Nachricht, dass das Objekt nicht im Container gefunden werden kann.

+0

Tuzo Sie waren genau richtig - der Installer für dotConnect fügt den Eintrag in die machine.config aber erwähnt dies nirgends in der Dokumentation (die ich sehen kann), weshalb es perfekt auf dem Entwicklungscomputer funktioniert. Sobald ich den Abschnitt zu meiner app.config hinzugefügt habe, ging es ins Leben und tat genau so, wie ich es erwartet hatte. Vielen Dank - Ich verbrachte 2 Tage damit, herauszufinden, was falsch war mit Sachen wie Fuslogvw, Prozessmonitor und mehr. –

+0

@StevePettifer, es scheint, dass Sie diesen Artikel in der Produktdokumentation nicht beachtet haben: http://www.devart.com/dotconnect/oracle/docs/Deployment.html. Sie können alle Informationen darin finden. – Devart

+0

@Devart - Ich habe dieses Dokument gelesen, aber es ist nicht klar, dass Sie dies benötigen, wenn Sie die neuen EL5-Methoden zum Abrufen von Datenbankinstanzen verwenden, die die DbProviderFactories erheblich abstrahieren, sofern Sie das nicht schon wissen. Außerdem heißt es nicht, dass Ihr Installer es zu machine.config hinzugefügt hat, was die Schlüsselunterlassung war. Ich schlage vor, dass Sie den DbProviderFactories-Eintrag in der machine.config während der Installation nicht hinzufügen sollten und stattdessen in der Dokumentation klarstellen, dass er zu app.config/web.config hinzugefügt werden muss (oder, wenn das der Benutzer wünscht, machine.config) manuell. –

Verwandte Themen