oracle11g - Problema DBNull con Oracle 11g proveedor ODP.Net
(3)
Estamos enfrentando un problema al verificar los parámetros de salida para "DBNull". El cliente de Oracle 11g / proveedor de ODP.Net considera el valor "DBNull" devuelto por el procedimiento o la función almacenada de Oracle como una cadena "nula". Esto funciona bien con el cliente Oracle 10g ya que devuelve "DBNull". Debido a esto, nuestra verificación "DBNull" falla
ODP.NET DEVUELVE LA CADENA "NULA" CUANDO EL VALOR ES NULO [ID 968857.1]
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
En este documento, los síntomas cambian la causa de la solución
Se aplica a: Oracle Data Provider para .NET - Versión: 10.2.0.2.20 a 11.1.0.7.10 Microsoft Windows (32 bits) Microsoft Windows x64 (64 bits)
Síntomas Después de migrar desde una versión anterior de Oracle Data Provider para .NET, puede producirse un cambio en el comportamiento con respecto a los valores nulos que se recuperan. Mientras que la aplicación devolvía previamente una cadena vacía, ahora se obtiene una cadena con el valor "nulo". Cambia la migración de 1.x ODP.NET a 2.x ODP.NET
Causa El comportamiento se debe a una migración del proveedor de datos de Oracle 1.x para .NET al proveedor de 2.x. 2.x ADO.NET admite la capacidad del proveedor para devolver tipos específicos del proveedor, y este es uno de los posibles "cambios de última hora" que van desde .NET 1.xa 2.x.
Las versiones 9.2.x, 10.1.x, 10.2.0.1.0 de ODP.NET fueron todos proveedores de marcos 1.x. Normalmente, este comportamiento se nota al migrar de una versión temprana de ODP a una versión más nueva de ODP, pero al mismo tiempo cambiar desde el proveedor de 1.x al proveedor de 2.x. Es el cambio en el soporte de .NET Framework en lugar del cambio en la versión del cliente de Oracle que causa este comportamiento.
También se puede observar que este comportamiento migra la aplicación a un sistema operativo de 64 bits, ya que no hay un marco de 1.x de 64 bits.
Solución Para resolver este comportamiento, el código deberá ser modificado.
Como solución alternativa, usar ODP.NET para 1.x (1.111.7.0 por ejemplo en lugar de 2.111.7.0) dará como resultado el comportamiento anterior, pero tenga en cuenta que el proveedor 1.x no está probado o no es compatible con ninguna versión de framework de 1.x, y ese soporte para 1.x no está planeado para ninguna versión posterior a 11.1.0.7.0
Si el sistema operativo es de 64 bits, la aplicación deberá forzarse para ejecutarse bajo el subsistema SYSWOW64 (es decir, como 32 bits) para utilizar 1.x ODP.NET.
Para corregir el código:
Si el valor es un DbType, puede verificar param.Value == DbNull.Value
Si el valor es un OracleDbType, puede verificar ((INullable) param.Value) .IsNull ya que los tipos de Oracle heredan la interfaz INullable.
Tras el cambio radical que lanzó Oracle (ver comentario a continuación). Necesita agregar el bit adicional a continuación:
if (oraParam[7] == null ||
oraParam[7].Value == DBNull.Value ||
((INullable)oraParam[7].Value).IsNull)
Inculable está en el espacio de nombres Oracle.DataAccess.Types.
O puedes intentar ...
(OracleString)result == OracleString.Null