Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Driver VS2010 + Oracle:ORA-12154:TSN:não foi possível resolver o identificador de conexão especificado


A melhor solução que encontrei foi usar a biblioteca Oracle Data Access Client e incluir toda a entrada de nomes TNS na string de conexão. Isso permite que o projeto seja facilmente publicado em um servidor web, ClickOnce, etc.

Aqui estão as etapas necessárias para configurar o driver Oracle funcionando em seu projeto:

1) Obtenha DLLs do pacote 'Oracle Data Provider for .NET'

Baixe o arquivo do instalador neste local:http://www.oracle. com/technetwork/topics/dotnet/index-085163.html

Eu fui em frente e instalei o ODAC completo de 200 MB com o Oracle Developer Tools para Visual Studio, mas você só precisa de quatro DLLs deste download. (Você pode extraí-los diretamente do pacote do instalador, em vez de passar por todo o processo de instalação, ou talvez um dos downloads menores inclua todos eles.)

2) DLLs de referência em seu projeto

Pesquise o diretório de instalação do Oracle Data Access Client e arraste as quatro DLLs a seguir para a raiz do seu projeto:
  • Oracle.DataAccess.dll
  • oci.dll
  • oraciicus11.dll
  • OraOps11w.dll

Defina o Copiar para o diretório de saída propriedade de todos os arquivos, exceto Oracle.DataAccess.dll para Copiar sempre .

Em Projeto --> Adicionar referência... , clique em Procurar guia e selecione o arquivo Oracle.DataAccess.dll.

3) Use o driver com a string de conexão completa (opcional)

Para não precisar se preocupar com a configuração dos arquivos de nomes TNS nas máquinas em que o aplicativo foi implantado, coloquei toda a definição no arquivo, conforme mostrado por connectionstrings.com . Isso torna a string de conexão um pouco volumosa, mas removeu muitas das dores de cabeça do arquivo TNS Names que eu estava enfrentando antes:
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=servername)(PORT=‌​1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));User Id=username;Password=********;

Aqui está a classe completa que usei para testar o 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.");
            }
        }
    }
}