DBNull выпускают с Oracle 11-граммового поставщика ODP.Net

Мы сталкиваемся с проблемой в проверке выходных параметров для “DBNull”. Значение “DBNull”, возвращенное хранимой процедурой Oracle или функцией, рассматривает как “пустую” строку оракул 11 г client/ODP.Net поставщик. Это хорошо работает с клиентом 10 г оракула, поскольку это возвращает “DBNull”. Из-за этого всего нашего “DBNull” проверяют сбои

5
задан Hiscal 9 June 2010 в 08:46
поделиться

2 ответа

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.

5
ответ дан 14 December 2019 в 08:42
поделиться

После критического изменения, выпущенного Oracle (см. Комментарий ниже). Вам необходимо добавить дополнительный бит ниже:

if (oraParam[7] == null || 
    oraParam[7].Value == DBNull.Value ||
    ((INullable)oraParam[7].Value).IsNull)

INullable находится в пространстве имен Oracle.DataAccess.Types.

1
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: