Oracle
 sql >> Datenbank >  >> RDS >> Oracle

VS2010 + Oracle-Treiber:ORA-12154:TSN:Konnte die angegebene Verbindungskennung nicht auflösen

Die beste Lösung, die ich gefunden habe, bestand darin, die Oracle Data Access Client-Bibliothek zu verwenden und den gesamten TNS-Namenseintrag in die Verbindungszeichenfolge aufzunehmen. Dadurch kann das Projekt einfach auf einem Webserver, ClickOnce usw. veröffentlicht werden.

Hier sind die notwendigen Schritte, um den Oracle-Treiber einzurichten, der in Ihrem Projekt funktioniert:

1) Holen Sie sich DLLs aus dem Paket „Oracle Data Provider for .NET“

Laden Sie die Installationsdatei von diesem Speicherort herunter:http://www.oracle. com/technetwork/topics/dotnet/index-085163.html

Ich habe den vollen 200-MB-ODAC mit Oracle Developer Tools für Visual Studio installiert, aber Sie brauchen nur vier DLLs aus diesem Download. (Möglicherweise können Sie sie direkt aus dem Installationspaket extrahieren, anstatt den gesamten Installationsprozess zu durchlaufen, oder vielleicht enthält einer der kleineren Downloads alle.)

2) Verweisen Sie auf DLLs in Ihrem Projekt

Durchsuchen Sie das Installationsverzeichnis des Oracle Data Access Client und ziehen Sie die folgenden vier DLLs in das Stammverzeichnis Ihres Projekts:

  • Oracle.DataAccess.dll
  • oci.dll
  • oraciicus11.dll
  • OraOps11w.dll

Legen Sie In Ausgabeverzeichnis kopieren fest Setzen Sie alle Dateien außer Oracle.DataAccess.dll auf Immer kopieren .

Unter Projekt --> Referenz hinzufügen... , klicken Sie auf Durchsuchen und wählen Sie die Datei Oracle.DataAccess.dll aus.

3) Verwenden Sie den Treiber mit vollständiger Verbindungszeichenfolge (optional)

Um mich nicht darum kümmern zu müssen, dass TNS-Namensdateien auf den Computern eingerichtet werden, auf denen die Anwendung bereitgestellt wurde, habe ich die gesamte Definition in die Datei eingefügt, wie durch connectionstrings.com . Es macht die Verbindungszeichenfolge ein wenig sperrig, beseitigt aber viele der Probleme mit der TNS-Namensdatei, die ich zuvor hatte:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=servername)(PORT=‌​1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));User Id=username;Password=********;

Hier ist die vollständige Klasse, mit der ich den Treiber getestet habe:

using System;
using System.Data;
using Oracle.DataAccess.Client;

static class Program
{
    [STAThread]
    static void Main()
    {
        TestOracle();
    }

    private static void TestOracle()
    {
        string connString = 
            "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" + 
            "(HOST=servername)(PORT=‌​1521)))" +
            "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));"+ 
            "User Id=username;Password=********;";
        using (OracleConnection conn = new OracleConnection(connString))
        {
            string sqlSelect = "SELECT * FROM TEST_TABLE";
            using (OracleDataAdapter da = new OracleDataAdapter(sqlSelect, conn))
            {
                var table = new DataTable();
                da.Fill(table);

                if (table.Rows.Count > 1) 
                    Console.WriteLine("Successfully read oracle.");
            }
        }
    }
}