¿Cuál es la huella mínima de cliente requerida para conectar C# a una base de datos Oracle?
Pregunta
Me conecté exitosamente a una base de datos Oracle (10g) desde C# (Visual Studio 2008) descargando e instalando las herramientas de administración del cliente y Visual Studio 2008 en mi computadora portátil.
El espacio de instalación para las herramientas de Oracle Client fue de más de 200 Mb y fue bastante largo.
¿Alguien sabe cuál es la huella mínima viable?Espero que sea una única DLL y un comando de registro, pero tengo la sensación de que necesito instalar una casa de Oracle y configurar varias variables de entorno.
Estoy usando Oracle.DataAccess en mi código.
Solución
Necesita un Cliente Oracle para conectarse a una base de datos Oracle.La forma más sencilla es instalar el Componentes de acceso a datos de Oracle.
Para minimizar la huella, sugiero lo siguiente:
- Utilice el proveedor de Microsoft para Oracle (System.Data.OracleClient), que se incluye con el marco.
- Descargar el Paquete de cliente instantáneo de Oracle - Básico Lite:Este es un archivo zip con (casi) lo mínimo.Recomiendo la versión 10.2.0.4, que es mucho más pequeña que la versión 11.1.0.6.0.
- Descomprima los siguientes archivos en una carpeta específica:
- v10:
- oci.dll
- orannzsbb10.dll
- oraociicus10.dll
- v11:
- oci.dll
- orannzsbb11.dll
- oraociei11.dll
- v10:
- En una plataforma x86, agregue la DLL CRT para Visual Studio 2003 (msvcr71.dll) a esta carpeta, ya que los chicos de Oracle se olvidaron de hacerlo. Lee esto...
- Agregue esta carpeta a la variable de entorno PATH.
- Utilizar el Nomenclatura de conexión sencilla método en su aplicación para deshacerse del infame archivo de configuración TNSNAMES.ORA.Se parece a esto :
sales-server:1521/sales.us.acme.com
.
Esto equivale a aproximadamente 19Mb (v10).
Si no le interesa compartir esta carpeta entre varias aplicaciones, una alternativa sería enviar las DLL mencionadas anteriormente junto con los archivos binarios de su aplicación y omitir el paso de configuración de RUTA.
Si es absolutamente necesario utilizar el proveedor de Oracle (Oracle.DataAccess), necesitará:
- ODP .NET 11.1.0.6.20 (la primera versión que supuestamente funciona con Instant Client).
- Instant Client 11.1.0.6.0, obviamente.
Tenga en cuenta que no he probado esta última configuración...
Otros consejos
A partir de 2014, OPD.NET, Managed Driver, es el que ocupa el menor espacio.
Aquí hay una comparación del uso del código con las versiones no administradas que sugirieron respuestas anteriores (obsoletas):http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
Necesitará descargar estos dlls y hacer referencia Oracle.ManagedDataAccess.dll
en tu proyecto:Descargar el ODP.NET, versión Managed Driver Xcopy únicamente
A continuación se muestra una huella típica que deberá incluir en el paquete con su lanzamiento:
Oracle.ManagedDataAccess.dll
Oracle.ManagedDataAccessDTC.dll
todos juntos, un grandísimo 6,4 MB para .Net 4.0.
Utilizo el método sugerido por Pandicus anteriormente, en Windows XP, usando ODAC 11.2.0.2.1.Los pasos son los siguientes:
- Descargue el paquete "ODAC 11.2 Versión 3 (11.2.0.2.1) con Xcopy Deployment" de oracle.com (53 MB) y extraiga el archivo ZIP.
- Recopile las siguientes DLL:oci.dll (1 MB), oraociei11.dll (130 MB!), OraOps11w.dll (0,4 MB), Oracle.DataAccess.dll (1 MB).El resto del material se puede eliminar y no es necesario instalar nada.
- Agregue una referencia a Oracle.DataAccess.dll, agregue
using Oracle.DataAccess.Client;
a tu código y ahora puedes usar tipos comoOracleConnection
,OracleCommand
yOracleDataReader
para acceder a una base de datos Oracle.Ver el documentación de clase para detalles.No es necesario utilizar el archivo de configuración tnsnames.ora, sólo el Cadena de conexión debe configurarse correctamente. - Las 4 DLL anteriores deben implementarse junto con su ejecutable.
De esta manera le permite conectarse con ODP.net usando 5 archivos redistribuibles de Oracle:
Editar:Por si el blog se cae, aquí tenéis un breve resumen...
- oci.dll
- Oracle.DataAccess.dll
- oraociicus11.dll
- OraOps11w.dll
- orannzsbb11.dll
- oraocci11.dll
- ociw32.dll
asegúrese de obtener TODAS esas DLL de la misma distribución ODP.Net/ODAC para evitar conflictos con el número de versión y colóquelas todas en la misma carpeta que su EXE.
DevArt http://www.devart.com/, anteriormente CoreLab (crlab.com) proporciona un cliente Oracle de C# puro.Es un solo dll y funciona bien.
Aquí hay una actualización para Oráculo 11.2.0.4.0.Tuve éxito con el siguiente procedimiento en ventana 7 usando System.Data.OracleClient
.
1. Descargar Paquete de cliente instantáneo: Basic Lite: Windows de 32 bits o 64 bits.
2. Copie los siguientes archivos a una ubicación en la ruta de su 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. Construya una cadena de conexión que omite la necesidad de tnsnames.ora.
(Vea los ejemplos en el programa de prueba a continuación).
4. Ejecute este programa mínimo de C# para probar su instalación:
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);
}
}
Consejo final: Si encuentra el error "System.Data.OracleClient requiere la versión 8.1.7 del software cliente de Oracle", ver esta pregunta.
ODAC xcopy le permitirá ocupar unos 45 MB.http://www.oracle.com/technology/software/tech/windows/odpnet/index.html
También encontré muy útil esta publicación en el foro de Oracle:
Cómo configurar Oracle Instant Client con Visual Studio
Observación:el equipo de ADO.NET está desaprobando System.Data.OracleClient, por lo que para proyectos futuros debería utilizar ODP.NET
Reproducción:
Configure las siguientes variables de entorno:
- asegúrese de que no haya ningún otro directorio de Oracle en su RUTA
- establecer su CAMINO para señalar a su cliente instantáneo
- establecer su TNS_ADMIN Se encuentra donde se encuentra el archivo tnsnames.ora
- establecer su NLS_LANG
- establecer su ORACLE_HOME a tu cliente instantáneo
Para mí, configuré NLS_LANG en
http://download-east.oracle.com/docs/html/A95493_01/gblsupp.htm#634282
Verifiqué que esto estaba usando el software de cliente correcto usando el complemento sqlplus para el cliente instantáneo.
Para mí, puse:ESTABLECER NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
Nota:Antes de realizar cualquier cambio, haga una copia de seguridad de su clave de registro de Oracle (si existe) y haga una copia de seguridad de la cadena para cualquier variable de entorno.