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