powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / вызов функции(return array) Oracle из C#
3 сообщений из 3, страница 1 из 1
вызов функции(return array) Oracle из C#
    #38082602
alxndr92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Допустим есть пакет и в нем функция..
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE PACKAGE pkg IS
TYPE indx2 IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
TYPE massiv IS TABLE OF indx2 INDEX BY PLS_INTEGER;
mas massiv;
FUNCTION PrintMas RETURN massiv;
END pkg;
/

CREATE OR REPLACE PACKAGE BODY pkg IS
FUNCTION PrintMas RETURN massiv IS
mas massiv;
BEGIN
mas(1)(1):=2;  mas(1)(2):=4;  mas(1)(3):=1; mas(1)(4):=0; mas(1)(5):=0; mas(1)(6):=64; mas(1)(7):=0;
mas(2)(1):=1;  mas(2)(2):=2;  mas(2)(3):=0; mas(2)(4):=1; mas(2)(5):=0; mas(2)(6):=70; mas(2)(7):=0;
mas(3)(1):=0;  mas(3)(2):=-1; mas(3)(3):=0; mas(3)(4):=0; mas(3)(5):=1; mas(3)(6):=18; mas(3)(7):=0;
mas(4)(1):=-5; mas(4)(2):=-7; mas(4)(3):=0; mas(4)(4):=0; mas(4)(5):=0; mas(4)(6):=0;  mas(4)(7):=0;
RETURN(mas);
END PrintMas;
END pkg;
/



Как мне получить значения mas в C#, хоть как-нибудь, будь то строка,массив... (массив лучше всего с таким же индексированием)

Я делаю так:
Код: c#
1.
2.
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            OracleConnection conn = new OracleConnection(@"Data Source=
                                                            (DESCRIPTION=
                                                            (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))
                                                            (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));
                                                            User Id=scott;Password=TIGER;");
            conn.Open();
            OracleCommand comand = new OracleCommand("pkg.PrintMas", conn);
            comand.CommandType = CommandType.StoredProcedure;
            comand.Parameters.Add("mas", OracleDbType.Object).Direction = ParameterDirection.ReturnValue;
            comand.ExecuteNonQuery();
            label1.Text += "\r";
            label1.Text += comand.Parameters["mas"].Value.ToString();



Ошибка в
Код: c#
1.
comand.ExecuteNonQuery();

,
Invalid parameter binding
Имя параметра: mas

Подозреваю, что проблема из-за того, что у меня массив массивов...

Заранее благодарен за помощь
...
Рейтинг: 0 / 0
вызов функции(return array) Oracle из C#
    #38082604
alxndr92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так
Код: c#
1.
comand.Parameters.Add("mas", OracleDbType.Array).Direction = ParameterDirection.ReturnValue;


тоже не работает.
Аналогичная ошибка
...
Рейтинг: 0 / 0
вызов функции(return array) Oracle из C#
    #38082787
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alxndr92Здравствуйте.

Допустим есть пакет и в нем функция..
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE PACKAGE pkg IS
TYPE indx2 IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
TYPE massiv IS TABLE OF indx2 INDEX BY PLS_INTEGER;
mas massiv;
FUNCTION PrintMas RETURN massiv;
END pkg;
/

Как мне получить значения mas в C#, хоть как-нибудь, будь то строка,массив... (массив лучше всего с таким же индексированием)
Так работать не будет: в этом контексте нельзя использовать типы, декларированные в pl/sql-пакетах... Т.е., предварительно нужно создать пользовательские типы данных indx2 и massiv :
Код: plsql
1.
2.
CREATE TYPE indx2 IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
CREATE TYPE massiv IS TABLE OF indx2 INDEX BY PLS_INTEGER;


alxndr92Подозреваю, что проблема из-за того, что у меня массив массивов...
Нет - "в-общем" случае это работает.
Нужно только использовать "не-пакетные" типы данных, выполнить мапинг соответствующих пользовательских типов Oracle через классы в .NET и правильно привязывать параметры и возвращаемые результаты вызываемых процедур и функций к получившимся классам.

Установите полный комплект ODT.NET - в нем есть примеры использования для разных случаев. Ну, а если у Вас не экспресс-версия студии, то, и мастера есть, которые помогут более правильным образом выполнить привязку типов данных возвращаемых результатов для процедур и функций Oracle. :)

За подробностями не забываем, естественно, обращаться к документации
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / вызов функции(return array) Oracle из C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]