sql >> Base de Datos >  >> RDS >> Oracle

VS2010 + controlador de Oracle:ORA-12154:TSN:no se pudo resolver el identificador de conexión especificado

La mejor solución que encontré fue usar la biblioteca Oracle Data Access Client e incluir la entrada completa de nombres TNS en la cadena de conexión. Esto permite que el proyecto se publique fácilmente en un servidor web, ClickOnce, etc.

Estos son los pasos necesarios para configurar el controlador de Oracle en su proyecto:

1) Obtener archivos DLL del paquete 'Oracle Data Provider for .NET'

Descargue el archivo de instalación desde esta ubicación:http://www.oracle. com/technetwork/topics/dotnet/index-085163.html

Seguí adelante e instalé el ODAC completo de 200 MB con Oracle Developer Tools para Visual Studio, pero realmente solo necesita cuatro archivos DLL de esta descarga. (Es posible que pueda extraerlos directamente del paquete de instalación, en lugar de pasar por todo el proceso de instalación, o tal vez una de las descargas más pequeñas los incluya todos).

2) DLL de referencia en su proyecto

Busque el directorio de instalación de Oracle Data Access Client y arrastre los siguientes cuatro archivos DLL a la raíz de su proyecto:

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

Establezca Copiar en el directorio de salida propiedad todos los archivos excepto Oracle.DataAccess.dll para Copiar siempre .

En Proyecto --> Agregar referencia... , haga clic en Examinar y seleccione el archivo Oracle.DataAccess.dll.

3) Utilice el controlador con la cadena de conexión completa (opcional)

Para no tener que preocuparme por la configuración de los archivos de nombres TNS en las máquinas en las que se implementó la aplicación, puse la definición completa en el archivo como se muestra en connectionstrings.com . Hace que la cadena de conexión sea un poco voluminosa, pero eliminó muchos de los dolores de cabeza del archivo TNS Names que estaba experimentando antes:

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

Aquí está la clase completa que usé para probar el controlador:

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