Проблема параметров ODP .NET с типом данных uint - PullRequest
2 голосов
/ 04 ноября 2010

После обновления от собственного поставщика данных Oracle .NET до Oracles ODP.NET я столкнулся со следующей проблемой.

У меня есть хранимая процедура, которая является частью пакета, и она принимает 32 параметра, все IN, кроме одного, обозначенного как параметр OUT.Во всяком случае, вот проблема, которая у меня возникла.У меня есть параметр даты, переданный как varchar2, а затем еще 3 параметра, которые также являются varchar2.В остальном все они типа NUMBER.

В моем .NET-коде все значения, передаваемые хранимой процедуре, являются либо строковыми, либо int, с 4 исключениями.У меня есть 4 элемента данных типа UInt32.Значение, которое они содержат, слишком велико для типа int, поэтому использовался uint.

В этом проблема.Когда мы использовали собственный поставщик данных Oracle .NET, в конструктор параметров был включен тип данных OracleType.Number, теперь у конструктора параметров Oracle есть OracleDbType.Int32 и OracleDbType.Int64.Тип данных uint не имел проблемы, когда был задан в качестве значения параметра типа данных OracleType.Number, но теперь с новым клиентом я получаю разные ошибки в зависимости от типов данных, которые я использую.

(ПоКстати, хранимая процедура работает нормально при вызове со значениями, которые я передаю. Все эти исключения встречаются в операторе ExecuteNonQuery экземпляра объекта Oracle Command.)

Я изменил тип данных, содержащий мои значения кака также тип данных параметра, используя следующие комбинации.Вот результаты каждого.

.NET Datatype ' uint ' Тип данных ODP .NET Параметр 'OracleDbType.Int32' * System.OverflowException: значение было либослишком большой или слишком маленький для Int32.в System.Convert.ToInt32 (значение UInt32) в System.UInt32.System.IConvertible.ToInt32 (поставщик IFormatProvider) в System.Convert.ToInt32 (значение объекта) в Oracle.DataAccess.Client.OracleParameter.PreBind_Int32 () в Oracle.DataAccess.Client.OracleParameter.PreBind (OracleConnection conn, IntPtr errCtx, Int32 arraySize) в Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery () в ScoutLoaderService.EventLoader.Load () *

* 101at. .uint 'Тип данных параметра ODP .NET ' OracleDbType.Int64 ' Oracle.DataAccess.Client.OracleException ORA-06502: PL / SQL: ошибка числа или значения: ошибка преобразования символа в числоORA-06512: в строке 1 в Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx pOpoSqlValCtx, процедура получения объекта, объектная ссылка на объект).HandleError (Int32 errCode, OracleConnection conn, строковая процедура, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src, Boolean bCheck) в Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery () в ScoutLoaderService.EventLoader.Load () * * * * 28 * * * 1026.'Тип данных параметра ODP .NET ' OracleDbType.Int64 ' Oracle.DataAccess.Client.OracleException ORA-06502: PL / SQL: ошибка числа или значения: ошибка преобразования символа в число ORA-06512:в строке 1 в Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx pOpoSqlValCtx, объектный источник, процедура String, логическая переменная класса.errCode, OracleConnection conn, процедура String, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, объект src, логический bCheck) в Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery ()

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Оказывается, проблема не имеет ничего общего с типами данных. Я использовал Int64 в параметре Oracle, и он работал, но только после того, как для свойства BindByName в моем объекте Command было установлено значение true.

Очевидно, по умолчанию для поставщика .NET System.Data.OracleClient используется «BINDING BY NAME», тогда как для Oracle.DataAccess по умолчанию используется «BIND BY POSITION».

Было бы неплохо, если бы обнаруженное исключение Oracle содержало больше информации, например, какой параметр вызывал исключение. Возможно, это помогло мне быстрее обнаружить проблему.

0 голосов
/ 04 ноября 2010

Я думаю, что OracleDecimal это путь сюда проверить Преобразование типов данных ; даже здесь они отображают int34 в BINARY_INTEGER.

кстати, OracleDecimal огромен, и у вас не должно быть никаких проблем

Вот еще один действительно хороший справочник: OracleParameterClass . Для возвращаемых параметров может быть очень полезным OracleDbTypeEx .

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