Qual é o tamanho mínimo exigido pelo cliente para conectar o C # a um database Oracle?

Conectei-me com êxito a um database Oracle (10g) a partir do C # (Visual Studio 2008) baixando e instalando as ferramentas de administração de clientes e o Visual Studio 2008 no meu laptop.

O footprint de instalação para as ferramentas do Oracle Client era superior a 200Mb e bastante longo.

Alguém sabe qual é a pegada mínima viável? Eu espero que seja uma DLL única e um comando register, mas tenho a sensação de que preciso instalar um oracle home e definir várias variables ​​de ambiente.

Estou usando o Oracle.DataAccess no meu código.

Você precisa de um cliente Oracle para se conectar a um database Oracle. A maneira mais fácil é instalar o Oracle Data Access Components .

Para minimizar a pegada, sugiro o seguinte:

  • Use o provedor da Microsoft para Oracle (System.Data.OracleClient), fornecido com a estrutura.
  • Baixe o Pacote Oracle Instant Client – Basic Lite: este é um arquivo zip com (quase) o mínimo. Eu recomendo a versão 10.2.0.4, que é muito menor que a versão 11.1.0.6.0.
  • Descompacte os seguintes arquivos em uma pasta específica:
    • v10:
      • oci.dll
      • orannzsbb10.dll
      • oraociicus10.dll
    • v11:
      • oci.dll
      • orannzsbb11.dll
      • oraociei11.dll
  • Em uma plataforma x86, adicione a DLL CRT para o Visual Studio 2003 (msvcr71.dll) a essa pasta, pois os caras da Oracle esqueceram de ler …
  • Adicione esta pasta à variável de ambiente PATH.
  • Use o método Easy Connect Naming em seu aplicativo para se livrar do infame arquivo de configuração TNSNAMES.ORA. Parece o seguinte: sales-server:1521/sales.us.acme.com .

Isso equivale a cerca de 19Mb (v10).

Se você não se importar em compartilhar essa pasta entre vários aplicativos, uma alternativa seria enviar as DLLs mencionadas acima junto com os binários do aplicativo e ignorar a etapa de configuração PATH.

Se você realmente precisar usar o provedor Oracle (Oracle.DataAccess), precisará:

  • ODP .NET 11.1.0.6.20 (a primeira versão que supostamente funciona com o Instant Client).
  • Instant Client 11.1.0.6.0, obviamente.

Note que eu não testei esta última configuração …

A partir de 2014, o OPD.NET, Driver Gerenciado é o menor footprint.

Aqui está uma comparação de uso de código para as versões não gerenciadas que as respostas anteriores (desatualizadas) sugeriram: http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148

Você precisará fazer o download dessas dlls e fazer referência ao Oracle.ManagedDataAccess.dll em seu projeto: Faça o download somente da versão do ODP.NET, Managed Driver Xcopy

Aqui está um típico footprint que você precisará para empacotar com o seu lançamento:

  1. Oracle.ManagedDataAccess.dll
  2. Oracle.ManagedDataAccessDTC.dll

todos juntos, um enorme 6,4 MB para. Net 4.0.

Eu uso o método sugerido pelo Pandicus acima, no Windows XP, usando o ODAC 11.2.0.2.1. As etapas são as seguintes:

  1. Faça o download do pacote “ODAC 11.2 Release 3 (11.2.0.2.1) com Xcopy Deployment” do oracle.com (53 MB) e extraia o ZIP.
  2. Colete as seguintes DLLs: oci.dll (1 MB), oraociei11.dll (130 MB!), OraOps11w.dll (0,4 MB), Oracle.DataAccess.dll (1 MB). O material restante pode ser excluído e nada precisa ser instalado.
  3. Adicione uma referência ao Oracle.DataAccess.dll, adicione using Oracle.DataAccess.Client; para o seu código e agora você pode usar tipos como OracleConnection , OracleCommand e OracleDataReader para acessar um database Oracle. Veja a documentação da turma para detalhes. Não há necessidade de usar o arquivo de configuração tnsnames.ora, apenas a cadeia de conexão deve ser definida corretamente.
  4. As 4 DLLs acima devem ser implantadas junto com o seu executável.

Desta forma, você pode se conectar ao ODP.net usando 5 arquivos redistribuíveis da oracle:

Entrada do blog de Chris: Usando o novo ODP.Net para acessar o Oracle a partir do C # com implementação simples

Edit: No caso do blog todo cair, aqui está um breve resumo …

  • oci.dll
  • Oracle.DataAccess.dll
  • oraociicus11.dll
  • OraOps11w.dll
  • orannzsbb11.dll
  • oraocci11.dll
  • ociw32.dll

Certifique-se de obter todas as DLLs da mesma distribuição ODP.Net / ODAC para evitar conflitos de números de versão e colocá-los todos na mesma pasta que seu EXE

DevArt http://www.devart.com/ , anteriormente CoreLab (crlab.com) fornece um cliente Oracle pure-C #. Essa é uma única dll e funciona bem.

Aqui está uma atualização para o Oracle 11.2.0.4.0 . Eu tive sucesso com o procedimento a seguir no Windows 7 usando System.Data.OracleClient .

1. Baixe o Pacote Instant Client – Basic Lite : Windows 32-Bit ou 64-Bit .

2. Copie os seguintes arquivos para um local no caminho do sistema:

32 bits

  1,036,288 2013-10-11 oci.dll 348,160 2013-10-11 ociw32.dll 1,290,240 2013-09-21 orannzsbb11.dll 562,688 2013-10-11 oraocci11.dll 36,286,464 2013-10-11 oraociicus11.dll 

64 bits

  691,712 2013-10-09 oci.dll 482,304 2013-10-09 ociw32.dll 1,603,072 2013-09-10 orannzsbb11.dll 1,235,456 2013-10-09 oraocci11.dll 45,935,104 2013-10-09 oraociicus11.dll 

3. Construa uma cadeia de conexão que omite a necessidade de tnsnames.ora .

(Veja exemplos no programa de teste abaixo.)

4. Execute este programa C # mínimo para testar sua instalação:

 using System; using System.Data; using System.Data.OracleClient; class TestOracleInstantClient { static public void Main(string[] args) { const string host = "yourhost.yourdomain.com"; const string serviceName = "yourservice.yourdomain.com"; const string userId = "foo"; const string password = "bar"; var conn = new OracleConnection(); // Construct a connection string using Method 1 or 2. conn.ConnectionString = GetConnectionStringMethod1(host, serviceName, userId, password); try { conn.Open(); Console.WriteLine("Connection succeeded."); // Do something with the connection. conn.Close(); } catch (Exception e) { Console.WriteLine("Connection failed: " + e.Message); } } static private string GetConnectionStringMethod1( string host, string serviceName, string userId, string password ) { string format = "SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" + "(HOST={0})(PORT=1521))" + "(CONNECT_DATA=(SERVER=DEDICATED)" + "(SERVICE_NAME={1})));" + "uid={2};" + "pwd={3};"; // assumes port is 1521 (the default) return String.Format(format, host, serviceName, userId, password); } static private string GetConnectionStringMethod2( string host, string serviceName, string userId, string password ) { string format = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" + "(HOST={0})(PORT=1521))" + "(CONNECT_DATA=(SERVER=DEDICATED)" + "(SERVICE_NAME={1})));" + "User Id={2};" + "Password={3};"; // assumes port is 1521 (the default) return String.Format(format, host, serviceName, userId, password); } } 

Dica final: Se você encontrar o erro “System.Data.OracleClient requer o software do cliente Oracle versão 8.1.7” , veja esta questão .

ODAC xcopy vai te levar para longe com cerca de 45MB. http://www.oracle.com/technology/software/tech/windows/odpnet/index.html

Eu encontrei este post no fórum Oracle muito útil também:

Como configurar o Oracle Instant Client com o Visual Studio

Observação: a equipe do ADO.NET está suspendendo o uso do System.Data.OracleClient para projetos futuros que você deve usar o ODP.NET

Reprodução:

Configure as seguintes variables ​​de ambiente:

  1. certifique-se de que nenhum outro diretório oracle esteja em seu PATH
  2. defina seu PATH para apontar para seu cliente instantâneo
  3. defina seu TNS_ADMIN para apontar para onde o arquivo tnsnames.ora está localizado
  4. defina seu NLS_LANG
  5. defina seu ORACLE_HOME para seu cliente instantâneo

Para mim, eu configurei NLS_LANG para

http://download-east.oracle.com/docs/html/A95493_01/gblsupp.htm#634282

Eu verifiquei que estava usando o software cliente correto usando o complemento sqlplus para o cliente instantâneo.

Para mim, eu configurei: SET NLS_LANG = AMERICAN_AMERICA.WE8MSWIN1252

Nota: antes de fazer qualquer alteração, faça backup de sua chave de registro do Oracle (se existir) e faça backup da cadeia de caracteres para quaisquer variables ​​de ambiente.

Leia a FAQ do Oracle Instant Client aqui