powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ODP.NET 11.2 Как воевать с параметрами команды?
4 сообщений из 4, страница 1 из 1
ODP.NET 11.2 Как воевать с параметрами команды?
    #37320241
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Вот банальный запрос: "select 1 from dual where :p1 > 0 and :p1 < 10"
который выполняется с ОДНИМ параметром
вот второй банальный запрос: "select 1 from dual where :p1 > 0 and :p1 < 10 and :p2 < 100"
который теоретически выполняется с ДВУМЯ параметрами....
ан нет выдает : ORA-01008: not all variables bound
далее вообще маразм с ТРЕМЯ параметрами первые два из которых совпадают РАБОТАЕТ.

Вопрос:
Какого принципа придерживаться, при использовании OracleDataProvider for .NET, передавать именованые параметры по кол-ву "имен"? не выходит, по количеству "вхождений" в запрос? тоже не есть гут...

Кто воевал с данной проблемой подскажите....


С уважением. Ашот.

P.S. Далее простое консольное приложение, наглядно демонстрирующее проблему:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
 static void Main(string[] args)
        {
            OracleConnection cnn = GetConnection();
            OracleCommand cmd; string cmdText; object result;

            cnn.Open();

            // этот блок работает. т.е. задаем 1 параметр и используем его в 2-х местах ( :p1 > 0 and :p1 < 10 )
            try
            {   
                cmdText = "select 1 from dual where :p1 > 0 and :p1 < 10";
                cmd = new OracleCommand(cmdText, cnn);
                cmd.Parameters.Add("p1", 3);

                result = cmd.ExecuteScalar();

                Console.WriteLine("{0} = {1}", cmdText, result);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            // тогда почему этот блок НЕ работает? 
            // т.е. с 2-я параметерамаи но используя их в 3-х местах ( :p1 > 0 and :p1 < 10 and :p2 < 100 ) 
            try 
            {
                cmdText = "select 1 from dual where :p1 > 0 and :p1 < 10 and :p2 < 100";
                cmd = new OracleCommand(cmdText, cnn);
                cmd.Parameters.Add("p1", 3);
                cmd.Parameters.Add("p2", 3);

                result = cmd.ExecuteScalar();
                Console.WriteLine("{0} = {1}", cmdText, result);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


            // а вот этот идиотизм ( дважды один и тот же параметр добавил ) работает???
            // т.е. с 3-я параметерамаи ( :p1 > 0 and :p1 < 10 and :p2 < 100 ) 
            try 
            {
                cmdText = "select 1 from dual where :p1 > 0 and :p1 < 10 and :p2 < 100";
                cmd = new OracleCommand(cmdText, cnn);
                cmd.Parameters.Add("p1", 3);
                cmd.Parameters.Add("p1", 3);
                cmd.Parameters.Add("p2", 3);

                result = cmd.ExecuteScalar();
                Console.WriteLine("{0} = {1}", cmdText, result);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadLine();

            cnn.Close();

        }
...
Рейтинг: 0 / 0
ODP.NET 11.2 Как воевать с параметрами команды?
    #37320291
karapetyan_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрост снимаю, решение нашел:
cmd.BindByName = true;
...
Рейтинг: 0 / 0
ODP.NET 11.2 Как воевать с параметрами команды?
    #37324591
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karapetyan_aВопрост снимаю, решение нашел:
cmd.BindByName = true;
/me думает: странно все это...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 // cmd.BindByName == false
cmd.CommandText = "select 1 from dual where (:p1>1) and (:p1<10) and (:p1=5)";
cmd.Parameters.Add("p1", 5 );
tmpObject = cmd.ExecuteScalar();

cmd.CommandText = "select 2 from dual where (:p1>1) and (:p1<10) and (:p2=5)";
cmd.Parameters.Add("p1",  5 );
cmd.Parameters.Add("p2",  5 );
tmpObject = cmd.ExecuteScalar();
пошло как дети в школу...

P.S. ODAC 11.2 Release 3 (11.2.0.2.1)
P.P.S. Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
...
Рейтинг: 0 / 0
ODP.NET 11.2 Как воевать с параметрами команды?
    #37324603
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I'm so sorry...
Таки - да... Для винегретного варианта cmd.BindByName = true - необходимо... (cmd.Parameters.Clear() забыл сделать)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ODP.NET 11.2 Как воевать с параметрами команды?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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