Является ли поставщик OraOLEDB в .NET ненадежным для полей CLOB? - PullRequest
4 голосов
/ 27 мая 2011

У меня есть запрос, который, кажется, возвращает неправильные данные из OleDbDataReader.Я включил фактический код ниже (с измененным идентификатором пользователя и паролем).Я работаю на Oracle Express 10g.

Если я запускаю приведенный ниже SQL-код в Oracle Web Admin Utility из Toad или если я изменяю приведенный ниже код на OracleConnection, все 4 возвращаемые записи имеютзначения в столбце «answer_text».

Однако из OleDbDataReader этот код создает исключение для второй записи, где он возвращает ноль для «answer_text» вместо ожидаемого значения: «Это второе открытое окнозаконченный комментарий. Теперь все становится по-настоящему сумасшедшим. "

Данное поле определено как CLOB в базе данных.

Итак, мой вопрос, является ли поставщик OraOLEDB просто ненадежным?Это действительно грязное поведение.3 из 4 записей возвращают данные правильно.Простое изменение OracleConnection с помощью OleDbConnection и удаление «Provider» из строки подключения, кажется, работает нормально.

Я не думаю, что мой клиент хочет сделать это, однако, по причинам распространения / поддержки.Oracle - только один из 4 поставщиков баз данных, которых мы поддерживаем, и этот код отлично работает для остальных.

Это известная ошибка?Есть какие-то тайные настройки, которые мне не хватает?У меня нет особого опыта работы с Oracle, и я не смог найти ничего из поиска этой проблемы.Любой совет будет оценен.

        var connection = new OleDbConnection("Provider=OraOLEDB.Oracle;Data Source=localhost;User Id=x;Password=x;");
        connection.Open();
        var command = connection.CreateCommand();
        command.CommandText = "select response_id, item_id, subitem_id, answer_id, answer_text, other_text, column_answer_id from sur_response_answer where item_id in (180, 181)";
        var reader = command.ExecuteReader();
        while (reader.Read())
        {
            if (reader.IsDBNull(reader.GetOrdinal("answer_text")))
                throw new Exception("This should not be happening");
        }

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Поддержка Oracle имеет ошибку 9866728, но это относится к поставщику OLEDB 11.2.0.1.Это было исправлено в исправлениях, перечисленных в документе 1272856.1.Для доступа к этим документам и исправлениям вам нужна учетная запись службы поддержки Oracle.

О Oracle Express 10g известно, что это неподдерживаемый выпуск (не было выпущено ни одного исправления) с некоторыми известными ошибками - я бы не стал его использоватьдля производственного применения.Присоединение к Oracle Partner Network позволит вам использовать лицензию на разработку / тестирование для разработки и тестирования на основе реальных выпусков, а не устаревшей (хотя и бесплатной ...).

1 голос
/ 30 августа 2011

Фантастика!

Была похожая проблема, когда набор записей, содержащий две записи (файлы tiff), успешно отображал первую запись, но выдавал ошибку re: тип аргумента для второй записи.

Определено, что только одна dll в патче для исправления OLE была изменена, и просто заменил эту одну dll (OraOLEDBrst11.dll в каталоге bin клиента oracle).

Теперь работает нормально.

0 голосов
/ 10 июля 2011

Странное поведение. Единственная ссылка, которую я нашел на форумах на такую ​​проблему, это эта старая ссылка на Oracle 8 !

Отладка наших классов БД с открытым исходным кодом в неуправляемом коде Delphi, я обнаружил ту же проблему! Так что это звучит не как ошибка DotNet или ADO, а проблема на стороне поставщика OraOleDB ...: (

BLOB, извлеченные из наших прямых классов OCI , просто содержат весь существующий контент BLOB, тогда как версия OleDB иногда возвращает NULL, а не для всех строк!

Звучит как проблема с провайдером. Я бы рекомендовал использовать прямой доступ OCI (собственный доступ Oracle в DotNet) и не полагаться на провайдера OleDB от Oracle ...

Я проверил это на последних клиентах и ​​серверах Oracle 11g с 32-битным клиентом под Win64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...