Oracle
 sql >> Database >  >> RDS >> Oracle

VS2010 + driver Oracle:ORA-12154:TSN:impossibile risolvere l'identificatore di connessione specificato

La soluzione migliore che ho trovato è stata quella di utilizzare la libreria Oracle Data Access Client e includere l'intera voce dei nomi TNS nella stringa di connessione. Ciò consente di pubblicare facilmente il progetto su un server Web, ClickOnce, ecc.

Di seguito sono riportati i passaggi necessari per configurare il driver Oracle funzionante nel tuo progetto:

1) Ottieni DLL dal pacchetto "Oracle Data Provider for .NET"

Scarica il file di installazione da questa posizione:http://www.oracle. com/technetwork/topics/dotnet/index-085163.html

Sono andato avanti e ho installato l'ODAC completo da 200 MB con Oracle Developer Tools per Visual Studio, ma sono necessarie solo quattro DLL da questo download. (Potresti essere in grado di estrarli direttamente dal pacchetto di installazione, invece di eseguire l'intero processo di installazione, o forse uno dei download più piccoli li include tutti.)

2) Fai riferimento alle DLL nel tuo progetto

Cerca nella directory di installazione di Oracle Data Access Client e trascina le seguenti quattro DLL nella radice del tuo progetto:

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

Imposta Copia nella directory di output tutti i file tranne Oracle.DataAccess.dll su Copia sempre .

In Progetto --> Aggiungi riferimento... , fai clic su Sfoglia scheda e selezionare il file Oracle.DataAccess.dll.

3) Utilizza il driver con la stringa di connessione completa (opzionale)

Per non dovermi preoccupare che i file dei nomi TNS vengano impostati sulle macchine su cui è stata distribuita l'applicazione, ho inserito l'intera definizione nel file come mostrato da connectionstrings.com . Rende la stringa di connessione un po' ingombrante, ma ha rimosso molti dei mal di testa dei file TNS Names che stavo riscontrando prima:

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

Ecco la classe completa che ho usato per testare il driver:

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.");
            }
        }
    }
}