martes, 12 de junio de 2012

Algunos errores de Oracle teniendo varios clientes instalados

Cuando en un mismo equipo se tienen instalados varios clientes de Oracle se pueden producir ciertos errores o excepciones, la mayoría de las cuales, no tienen una descripción que nos puedan llevar a determinar que es lo que está pasando.

Esto presenta un especial problema cuando se están desarrollando aplicaciones en distintas tecnologías que deben trabajar juntas o se están migrando aplicaciones a nuevas tecnologías, debiendo permanecer, al menos de momento, otras partes en tecnologías más antiguas.

La excepción sin descripción

El caso más escandaloso y que más puede traer de cabeza al equipo de desarrollo, es una excepción que se produce al abrir la conexión con un cliente de Oracle que no es el correcto.

Por ejemplo, si estamos desarrollando aplicaciones en .NET, con el Oracle Data Provider para .NET obtenido con un Oracle Data Access Component (ODAC) para Windows o en algún otro paquete, podemos encontrarnos con el error menos descriptivo que podíamos esperar, el mensaje está en blanco y lo único que nos proporciona es un ErrorCode.

Message: ""
ErrorCode: -2147467259


Si vemos el lugar en el que se ha producido el error, nos desorientará aún más con respecto al motivo concreto del error, ya que el StackTrace contiene la siguiente información:

StackTrace:
    at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
    at Oracle.DataAccess.Client.OracleConnection.Open()

Es decir, ha permitido que se cree una instancia del tipo Oracle.DataAccess.Client.OracleConnection, ha aceptado que se le asigne la cadena de conexión y al ejecutar el método Open es cuando da el error.

No hace falta que te vuelvas loco intentando ver que es lo que te falta, comprobando la cadena de conexión, ni nada por el estilo, simplemente es que tienes más de un cliente de Oracle instalado en el equipo y al coger uno de ellos a cogido el que no era.

La forma de resolver este problema es hacer que coja el cliente de Oracle que le corresponda, esto que en principio es bastante sencillos puede complicarse en exceso debido a la existencia de otras aplicaciones que deban utilizar otros clientes de Oracle. El orden en el que se busca el cliente a utilizar sería:
  1. Directorio de la aplicación o ejecutable.
  2. Ruta asignada a la propiedad DllPath del archivo app.config o del web.config.
  3. Ruta asignada a la propiedad DllPath del archivo machine.config
  4. Ruta asignada a DllPath en el Registro de Windows.
    HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\version\DllPath
  5. Directorios especificados en la variable de entorno de Windows PATH.
Para más información sobre la estructura de los archivos *.config, puedes echarle un vistazo al capítulo "Configuring Oracle Data Provider for .NET" de la Guía del Oracle Data Provider para desarrolladores .NET.

Error de OCIEnvCreate con código de retorno -1

Otro error que se puede producir en estos entornos con varios clientes de Oracle es el error "Error de OCIEnvCreate con código de retorno -1. Sin embargo, no está disponible el texto del mensaje de error." o "OCIEnvCreate failed with return code -1 but error message text was not available." si el cliente de Oracle está en inglés.

En este caso es el archivo OCI.DLL el causante de este problema y la solución puede complicarse en función de las aplicaciones que lo utilicen, ya que la clase System.Data.OracleClient es uno de los usuarios de dicha librería.

En esta caso la solución pasa por comprobar las carpetas a las que se va a acudir para localizar las distintas DLL's y verificar que la variable de entorno de Windows, PATH, está correctamente configurada. En principio, debe ser suficiente con copiar la DLL en la carpeta de la aplicación pero, en ocasiones no ha sido sufiente, ante la imposibilidad de cambiar el orden de los directorios en la variable del entorno he tenido que cambiarle el nombre al archivo OCI.DLL para que no lo encuentre en cierta ruta y acuda a la siguiente.

No hay comentarios:

Publicar un comentario