2010-11-12 3 views
1

я использую функцию:Вызов функции с параметрами типа, определяемых пользователем (Oracle ODP.NET)

fu_has_permissions(udt_person('johny','superman'),'fly_away') 

udt_person является определяемый пользователем тип:

create or replace TYPE udt_person AS OBJECT 
(name VARCHAR2(3), 
id VARCHAR2(18)); 

Я хочу использовать привязку переменные, называющие эту функцию, но я не уверен, что я делаю неправильно ... Вот код:

...... 
OracleParameter udtPersParam = new OracleParameter(); 
udtPersParam.ParameterName = ":pUdtPers"; 
udtPersParam.UdtTypeName = "UDT_PERS"; 
string[] paramValues = { name, id }; 
udtPersParam.Value = paramValues; 
OracleParameter pAction = new OracleParameter(":pAction", OracleDbType.Varchar2, 255); 
pAction.Value = action; 

parameters.Add(udtPartParam); 
parameters.Add(pAction); 

try 
{ 
_loginOdr = DBFacade.ExecuteSelectQuery("select fu_has_permissions(:pUdtPart, :pAction) from dual", parameters); 
} 

Спасибо!

+0

Какая ошибка у вас? Это опечатка, что 'UdtTypeName' не совпадает с именем типа Oracle? –

+0

«Значение не входит в ожидаемый диапазон», на линии udtPersParam.Value = paramValues; – maephisto

ответ

4

Структура UDT тип должен быть классом, который реализует IOracleCustomType и/или IOracleCustomTypeFactory, IOracleArrayTypeFactory

unfortuntately вы не можете просто создать массив строк и передать его в

взгляд в образцах ODP.NET, что приходят с установкой ODP % ora_home% \ client_1 \ odp.net \ образцы \ 4 \ UDT

также проверить эти ссылки для образцов и пошаговые http://developergeeks.com/article/35/working-with-user-defined-type-oracle-udt-and-custom-type-using-odp-net-11ghttp://www.codeproject.com/KB/database/ORACLE_UDT.aspx и http://st-curriculum.oracle.com/obe/db/hol08/dotnet/udt/udt_otn.htm

+0

Путь к образцам в моем случае был другим в 11.2: % ora_home% \ product \ 11.2.0 \ client_1_x86 \ ODACsamples \ odp.net \ 4 \ UDT –

+0

Кроме того, вторая ссылка здесь больше не работает для меня , –

1

Не знаю ничего о ODP.Net, но ошибка говорит о том, что вам не нравится использовать строковый массив в качестве значения параметра Oracle. Что не звучит необоснованно.

Быстрый google объекта odp.net varchar2 дал this OTN forum post в качестве первого результата; он включает в себя пример использования объекта примерно на полпути вниз, включая преобразование в типы объектов Oracle и из них.

1

, если бы я тебя, я бы взглянуть на ODP надстройка для Visual Studio. С этим вы можете подключиться к своей базе данных, выбрать UDT в базе данных и «Создать собственный класс», чтобы получить класс .net, который вы можете использовать.

Посмотрите на занятия, и вы увидите, что означает Харрисон. Обратите особое внимание на OracleObjectMappingAttributes поверх свойств и переопределения To/FromCustomObject.

Когда вы создаете свой OracleCommand, OracleParameter.Value должен быть классом этого типа.

Это должно помочь вам начать работу на высоком уровне. Слово предупреждения, хотя. Код, сгенерированный ODP, является уродливым, если не сказать больше, - мы намереваемся откалывать все классы, генерируемые ODP, в нашем собственном сценарии. Но вам нужно понять, что такое IOracleCustomType, IOracleCustomTypeFactory, IOracleArrayTypeFactory, INullable, прежде чем вы сможете это сделать.

Кстати, поскольку ваш конкретный вопрос окружает массивы, вы можете посмотреть здесь Oracle NTYPE, а не TYPE.

Смежные вопросы