2012-05-16 3 views
5

Hier ist mein Problem: Ich habe ein Programm in C#, die ODP.NET dlls: oci.dll, ociw32.dll, Oracle.DataAccess.dll, orannzbb11.dll, oraocci11.dll, oraociicus11.dll, OraOps11w verwenden. DLL.Wie richtigen Pfad zu TNSNAMES-Datei in C# -Anwendung festlegen?

Ich habe 2 Computer. Zuerst mit dem gesamten ODAC-Paket und dann ohne dieses Paket. Aber ich habe alle erforderlichen DLLs in meinem exe-Verzeichnis, so ODAC ist kein Problem (denke ich). Der Unterschied zwischen diesen Computern ist der Pfad zur TNSNAMES-Datei. Erstens: C: \ app \ OraHome_1 \ Network \ admin \ Zweitens: C: \ Oracle \ product \ 11.2.0 \ client_1 \ network \ admin

Und auf den ersten CPU-Programm funktioniert gut. Aber auf dem zweiten mit der gleichen Verbindungszeichenfolge, connot offene Verbindung (ORA-12154). Und mit SQL Plus kann ich auf beiden Computern verbinden.

Also, wie kann ich meinem Programm den richtigen Pfad zu TNSNAMES zeigen?

+0

Hier wurde der Client installiert. – SQLMason

+1

Also, überall, wo ich mein Programm verwenden möchte, muss der Client an der gleichen Stelle installiert werden? (hat den gleichen Weg)? – Marshall

Antwort

11

Sie die programmatisch TNS_ADMIN Umgebungsvariable festlegen. Sehen Sie diese Seite für eine step by step. Das ist, wenn Sie zu einer bestimmten TNS_NAMES.ORA Datei ändern möchten. Der Oracle-Client muss weiterhin auf dem Clientcomputer installiert sein.

Von ConnectionStrings - ohne TNS mit:

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword; 


EDIT: 3. Option hinzugefügt

Bitte see this question, die Sie bei der Suche nach den aktuellen Standort der TNS_NAMES.ORA-Datei des Clients unterstützen könnte - was Sie könnte öffnen und ändern, wenn Sie möchten (fügen Sie Ihre eigene Verbindung hinzu, wenn sie nicht existiert)

+0

Ich habe auch die Idee von @Marshall, TNS nicht zu verwenden und per IP zu verbinden. – SQLMason

+0

Danke, aber ich brauche TNSNAMES-Datei - Ich habe viele .. viele Datenbank und das ist sehr dynamisch Projekt.Menschen Hinzufügen und Entfernen von Datenbanken von dort.Aber wie auch immer: Ich brauche tnsname Datei, ich habe viele Computer mit (perheps) diffrent Pfad zu Orakel Clients und ohne ODP.NET installiert, und ich habe Programm in C#, die diese dlls verwenden: dlls: oci.dll, ociw32.dll, Oracle.DataAccess.dll, orannzbb11.dll, oraocci11.dll, oraociicus11.dll, OraOps11w. dll. Also die Lösung mit TNS_ADMIN Variable wird in Ordnung sein, richtig? – Marshall

+0

Wenn Sie Ihre eigene TNS_NAMES.ORA-Datei installieren (senden Sie es zusammen mit der Installation) * können * Sie das tun.Sie können jedoch andere Personen Einträge vermasseln - wenn sie ihre eigenen benutzerdefinierten Einträge haben y wäre, wenn möglich, per IP connect, die Umgebungsvariable ist eine Option, die speziell Ihre Frage beantwortet. – SQLMason

3

Sie müssen sich nicht um den Pfad Ihrer TNSNames-Datei kümmern: Sie wird automatisch von der Bibliothek selbst erkannt ... sobald Sie sie installiert haben. Das ist der entscheidende Punkt: Die Verteilung der DLL in Ihrem Projekt ist nicht genug. Sie müssen ODP.Net auf dem Computer installieren, der es verwenden muss: eigentlich erstellt die Installation einfach ein paar Registrierungseinträge, und einer von ihnen zeigt auf das richtige oracle-Verzeichnis (in dem die Bibliothek die tns-Namen bei Bedarf finden kann).

Morover, wie jemand darauf hingewiesen hat, benötigen Sie überhaupt keine tnsnams-Datei. Sie könnten alles innerhalb der Verbindungszeichenfolge schreiben. Hier ist ein ich in meiner Umgebung verwenden:

Data Source= (DESCRIPTION = 
     (ENABLE = BROKEN) 
     (ADDRESS_LIST = 
     (LOAD_BALANCE = ON) 
     (FAILOVER = ON) 
     (ADDRESS = (PROTOCOL = TCP)(Host =por10srv-a)(Port = 1521)) 
    ) 
     (CONNECT_DATA = 
     (SERVICE_NAME = por10.gruppo.autostrade.it) 
     (FAILOVER_MODE = 
     (TYPE = SELECT) 
     (METHOD = BASIC) 
     (RETRIES = 10) 
     (DELAY = 3) 
    ) 
    ) 
    );User ID=npa_collaudo;Password=npa_collaudo; 
+0

Nun .. Ich denke, installieren ODP.NET ist nicht notwendig. Ich war .. Ich versuche zu vermeiden, es zu installieren. Aber jetzt ... bin ich mir nicht sicher – Marshall

+0

Schau dir meinen Kommentar zu Dan Andrews 'Antwort an. – Marshall

+0

Sie benötigen TNSNAMES.ORA immer, wenn Sie sich auf die Konfiguration der Arbeitsstationen verlassen wollen ... Meine Erfahrung zeigt, dass der beste Weg, dies zu tun, darin besteht, Environment.Path-Einträge zu durchlaufen und "\ .. \ Network \ ADMIN \ TNSNAMES" anzuhängen.ORA ", um herauszufinden, welche vom InstantClient verwendet wurde. Dies scheint der wertvollste Weg zu sein, um herauszufinden, was wir bisher benutzt haben. – menssana

2

Sie müssen ODP.NET (oder den Oracle-Client) nicht installieren, da Sie die erforderlichen DLLs für einen lokalen verteilbaren Inline-Oracle-Client zu haben scheinen. In Ihrem Fall ist es möglich, dass sich die TNSNAMES.ORA-Datei im selben Ordner wie Ihre ausführbare Datei befindet und Ihr spezieller "Inline-Oracle-Client" sie von dort abholt. Andernfalls versucht der für Ihre Anwendung lokale Oracle-Client, ihn von jedem auf dem Computer installierten Client abzurufen.