Мы сталкиваемся с проблемой в проверке выходных параметров для “DBNull”. Значение “DBNull”, возвращенное хранимой процедурой Oracle или функцией, рассматривает как “пустую” строку оракул 11 г client/ODP.Net поставщик. Это хорошо работает с клиентом 10 г оракула, поскольку это возвращает “DBNull”. Из-за этого всего нашего “DBNull” проверяют сбои
ODP.NET, ВОЗВРАЩАЮЩАЯ «НУЛЕВАЯ» СТРОКУ, КОГДА ЗНАЧЕНИЕ НУЛЕВО [ID 968857.1]
Modified 04-JAN-2010 Type PROBLEM Status PUBLISHED
В этом документе Симптомы Изменения Причина Решение
Применимо к: Поставщик данных Oracle для .NET - версии: с 10.2.0.2.20 до 11.1.0.7.10 Microsoft Windows (32-разрядная) Microsoft Windows x64 (64-разрядная версия)
Проблема После перехода с предыдущей версии Oracle Data Provider for .NET может произойти изменение поведения в отношении извлекаемых значений NULL. В то время как приложение ранее возвращало пустую строку, теперь получается строка со значением «null». Изменения Переход с 1.x ODP.NET на 2.x ODP.NET
Причина Такое поведение вызвано переходом от поставщика данных Oracle 1.x для .NET к поставщику 2.x. 2.x ADO.NET поддерживает возможность поставщика возвращать типы, специфичные для поставщика, и это одно из потенциальных «критических изменений» при переходе с .NET 1.x на 2.x.
Все версии ODP.NET 9.2.x, 10.1.x, 10.2.0.1.0 были поставщиками инфраструктуры 1.x. Обычно такое поведение наблюдается при переходе с ранней версии ODP на более новую версию ODP, но в то же время при переключении с провайдера 1.x на провайдера 2.x. Такое поведение вызвано скорее изменением в поддержке платформы .NET, чем изменением версии клиента Oracle.
Такое поведение также можно заметить при переносе приложения на 64-битную операционную систему, поскольку 64-битная структура 1.x отсутствует.
Решение Чтобы решить эту проблему, необходимо изменить код.
В качестве временного решения использование ODP.NET для 1.x (1.111.7.0, например, вместо 2.111.7.0) приведет к предыдущему поведению, но обратите внимание, что поставщик 1.x не тестируется и не поддерживается ни в одной версии. фреймворка, отличного от 1.x, и эта поддержка 1.x не планируется ни для какой версии позже, чем 11.1.0.7.0
. Если операционная система 64-битная, приложение нужно будет принудительно запустить под Подсистема SYSWOW64 (т.е. как 32-битная) для использования 1.x ODP.NET.
Если значение - DbType, вы можете проверить param.Value == DbNull.Value
Если значение - OracleDbType, вы можете проверить ((INullable) param. Value) .IsNull, поскольку типы Oracle наследуют интерфейс INullable.
После критического изменения, выпущенного Oracle (см. Комментарий ниже). Вам необходимо добавить дополнительный бит ниже:
if (oraParam[7] == null ||
oraParam[7].Value == DBNull.Value ||
((INullable)oraParam[7].Value).IsNull)
INullable находится в пространстве имен Oracle.DataAccess.Types.