2013-11-12 2 views
1

Мне поручено передать даты начала и окончания даты в процедуру orcale с страницы aspx/C#. У меня есть 2 списка объектов DateTime на странице, список дат начала и список дат окончания.Передача списков DateTime для хранимой процедуры Oracle C#

Вопрос: как я должен это делать? Я считаю, что мне нужно будет создать определенный пользователем тип, чтобы перейти к процедуре, возможно, как массив 2d, но я действительно не уверен, как:

A. Заполните массив значениями из 2 списков, и:

B. Создайте пользовательский тип для перехода к процедуре.

Я немного поработал, но примеров этого мало, и я даже не уверен, что я на правильном пути. Я был бы признателен за любую помощь, поскольку я действительно изо всех сил пытаюсь разобраться в этом. Я включил код Oracle PL/SQL ниже (это не может быть изменен, как у меня нет возможности сделать ammendments):

PROCEDURE p_add_project_dates(

p_project_id IN CS01_PROJECT_HEADER.PROJECT_ID%TYPE, 

p_tab_project_dates IN t_tab_project_dates, 

    p_any_time_participation IN CS01_PROJECT_HEADER.ANY_TIME_PARTICIPATION%TYPE, 

    p_error_msg OUT VARCHAR2, 

p_return_code OUT NUMBER 

) IS 

occur_added_retcode NUMBER := 0; 

    occur_added_message VARCHAR2(500); 

BEGIN 

p_return_code := 0; 

-- Update ANY_TIME_PARTICIPATION. 

UPDATE CS01_PROJECT_HEADER 

    SET ANY_TIME_PARTICIPATION = p_any_time_participation 

    WHERE PROJECT_ID = p_project_id; 

    -- Add project occurrence for every record in p_tab_project_dates. 

FOR i IN 1 .. p_tab_project_dates.COUNT LOOP 

    CS02_PCK.p_add_project_occurrence(p_project_id, p_tab_project_dates(i).start_date, p_tab_project_dates(i).end_date, occur_added_message, occur_added_retcode); 

    IF occur_added_retcode = 20 THEN 

     p_return_code := 20; 

      EXIT; 

    END IF; 

    END LOOP; 

    IF p_return_code = 0 THEN 

    COMMIT; 

    ELSE 

    ROLLBACK; 

    p_error_msg := 'An unexpected error occurred'; 

    END IF; 

ИСКЛЮЧЕНИЕ

WHEN OTHERS THEN 

    ROLLBACK; 

    p_error_msg := 'An unexpected error occurred'; 

    p_return_code := 20; 

END p_add_project_dates;

+0

Вам нужно использовать ODP.NET для передачи UDT в сохраненный процесс. Предположительно вы можете использовать Oracle Developer Tools для создания классов для вас. Я использовал примеры и сам закодировал. [Эта статья] (http://developergeeks.com/article/3/user-defined-type-support-in-oracle-odp-net-11g) может помочь. Я также нашел [этот вопрос] (http://stackoverflow.com/q/980421/119477) полезным –

+0

так же, как в сторону, используя КОГДА ДРУГИЕ вернутся, чтобы преследовать вас. Лучшей практикой является использование исключений, которые вы ожидаете, таких как NO DATA FOUND и повышение всего остального. – kevinsky

+0

Спасибо за ссылки, проверит их. – Nick

ответ

1

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

Оказывает, что Visual Studio позволяет создать пользовательский класс из Oracle UDT (как указал Конрад), щелкнув правой кнопкой мыши по нему внутри схемы (внутри проводника сервера) и выбрав «создать пользовательский класс». Затем открывается мастер, который в основном делает все для вас.

Как только у меня появился пользовательский класс, я мог просто создать его экземпляр и заполнить даты начала и окончания этого экземпляра, а затем передать его как параметр хранимой proc.

Оказывается, что процедура, которую я вызывал, на самом деле не работала должным образом, поэтому на этот случай был установлен Oracle dev для исправления.

По крайней мере, теперь я знаю, как создать класс UDT.

Еще раз спасибо.

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