Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ODP.NET 11.2 Как воевать с параметрами команды? / 4 сообщений из 4, страница 1 из 1
22.06.2011, 15:35
    #37320241
karapetyan_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODP.NET 11.2 Как воевать с параметрами команды?
Всем привет.
Вот банальный запрос: "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
22.06.2011, 15:50
    #37320291
karapetyan_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODP.NET 11.2 Как воевать с параметрами команды?
Вопрост снимаю, решение нашел:
cmd.BindByName = true;
...
Рейтинг: 0 / 0
25.06.2011, 10:38
    #37324591
Ex_Soft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODP.NET 11.2 Как воевать с параметрами команды?
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
25.06.2011, 11:01
    #37324603
Ex_Soft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ODP.NET 11.2 Как воевать с параметрами команды?
I'm so sorry...
Таки - да... Для винегретного варианта cmd.BindByName = true - необходимо... (cmd.Parameters.Clear() забыл сделать)
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ODP.NET 11.2 Как воевать с параметрами команды? / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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