Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / параметры и dbnull / 24 сообщений из 24, страница 1 из 1
04.10.2016, 13:55
    #39320269
Алексей Шм.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Помогите разобраться. Выбираю все уникальные сочетания элементов, составляющие адрес( так получилось, что в бд под разными Id есть одинаковые значения адресов. Понадобилось выбрать I'd все уникальных адресов. Значения из одного запроса передаются значениям параметров другого заросла. Но вот беда - если, например, в бд значение корпуса null, то запрос поиска Id не возвращает значения.
Код: c#
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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
  SqlDataAdapter ada = new SqlDataAdapter();

            SqlCommand selectalladress = new SqlCommand();

            ada.SelectCommand = selectalladress;

            selectalladress.Connection = conn;

            DataTable dtalladress = new DataTable();

            selectalladress.CommandText = @"select distinct  nasp, ylic, ndom, nkorp, nkw from FRA where nasp is not null and ylic is not null and ndom is not null";

            //

            //

            //

            SqlDataAdapter ada2 = new SqlDataAdapter();

            SqlCommand selectalladress2 = new SqlCommand();

            ada2.SelectCommand = selectalladress2;

            selectalladress2.Connection = conn;

            DataTable dtalladress2 = new DataTable();

 

            selectalladress2.CommandText = @"select id from fra  where  nasp=@nasp and ylic=@ylic  and ndom=@ndom and nkorp=@nkorp and nkw=@nkw";

            SqlParameter nas = selectalladress2.Parameters.Add("@nasp", SqlDbType.VarChar);

            SqlParameter ulic = selectalladress2.Parameters.Add("@ylic", SqlDbType.VarChar);

            SqlParameter dom = selectalladress2.Parameters.Add("@ndom", SqlDbType.VarChar);

            SqlParameter nkorp = selectalladress2.Parameters.Add("@nkorp", SqlDbType.VarChar);

            SqlParameter nkw= selectalladress2.Parameters.Add("@nkw", SqlDbType.VarChar);

            //

           

            ada.Fill(dtalladress);

            foreach (DataRow rw in dtalladress.Rows)

            {

  

                nas.Value = rw[0].ToString();

                ulic.Value = rw[1].ToString(); ;

                dom.Value = rw[2].ToString();

                nkorp.Value = rw[3].ToString();

                nkw.Value =rw[4].ToString();

              

                ada2.Fill(dtalladress2);

                List<Int32> uniquefraid = new List<int>();

                foreach (DataRow rww in dtalladress2.Rows)

                {

                    uniquefraid.Add(Convert.ToInt32(rww[0]));

                }

 
...
Рейтинг: 0 / 0
04.10.2016, 15:47
    #39320372
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей Шм., (nkorp=@nkorp or @nkorp is null)
...
Рейтинг: 0 / 0
05.10.2016, 03:33
    #39320643
Алексей Шм.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
buserАлексей Шм., (nkorp=@nkorp or @nkorp is null)

Спасибо, что откликнулись!
Если я добавлю в запрос это (nkorp=@nkorp or nkorp is null) and (nkw=@nkw or nkw is null), то на выходе
получаю:
корп кв
NULL 14 NULL
NULL NULL NULL
NULL 14 NULL

То есть в ответ попадают и квартиры с номером (14), попадающие в запрос через параметр, и дома без квартир, т.е. с null
...
Рейтинг: 0 / 0
05.10.2016, 03:42
    #39320644
Алексей Шм.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
То есть мне нужно, чтобы выбрались строки (средняя строка), где квартира null. В параметр и переадается DbNull.Value, но запрос не отрабатывается, не находит записи. При добавлении or.. запрос расширяет условия поиска, что мне не нужно.
...
Рейтинг: 0 / 0
05.10.2016, 06:16
    #39320654
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей Шм., если у Вас значение параметра DBNull.Value, то в запросе должно быть просто nkorp IS NULL без всяких OR.
...
Рейтинг: 0 / 0
05.10.2016, 06:22
    #39320655
Алексей Шм.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
skyANAАлексей Шм., если у Вас значение параметра DBNull.Value, то в запросе должно быть просто nkorp IS NULL без всяких OR.

То есть мне на этапе присваивания значения параметрам проверять, если параметр DbNull.Value, то менять для этого параметра сам текст запроса?
...
Рейтинг: 0 / 0
05.10.2016, 06:23
    #39320656
Алексей Шм.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей Шм.,

Пока работает так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  if (rw[3] == DBNull.Value & rw[4]==DBNull.Value)
                {
                    selectalladress2.CommandText = @"select id from fra  where  nasp=@nasp and ylic=@ylic  and ndom=@ndom and nkorp is null and nkw is null";

                }
                else if (rw[3] == DBNull.Value & rw[4] != DBNull.Value)
                {
                     selectalladress2.CommandText = @"select id from fra  where  nasp=@nasp and ylic=@ylic  and ndom=@ndom and nkorp is null and nkw=@nkw";
                }
                else if (rw[3] != DBNull.Value & rw[4] == DBNull.Value)
                {
                     selectalladress2.CommandText = @"select id from fra  where  nasp=@nasp and ylic=@ylic  and ndom=@ndom and nkorp=@nkorp and nkw is null";
                }
                else   selectalladress2.CommandText = @"select id from fra  where  nasp=@nasp and ylic=@ylic  and ndom=@ndom and nkorp=@nkorp  and nkw=@nkw";



Но это же костыль
...
Рейтинг: 0 / 0
05.10.2016, 06:42
    #39320659
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей Шм.skyANAАлексей Шм., если у Вас значение параметра DBNull.Value, то в запросе должно быть просто nkorp IS NULL без всяких OR.

То есть мне на этапе присваивания значения параметрам проверять, если параметр DbNull.Value, то менять для этого параметра сам текст запроса?
Не менять текст запроса, а формировать его в зависимости от параметров. Собирать условие WHERE из отдельных кусочков.
...
Рейтинг: 0 / 0
05.10.2016, 06:45
    #39320660
Алексей Шм.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
skyANAАлексей Шм.пропущено...


То есть мне на этапе присваивания значения параметрам проверять, если параметр DbNull.Value, то менять для этого параметра сам текст запроса?
Не менять текст запроса, а формировать его в зависимости от параметров. Собирать условие WHERE из отдельных кусочков.

Понял. Но неужели параметр не понимает, что если он DbNull.Value, то в запросе нужно автоматически прикинуться is null...( вопрос риторический..)
...
Рейтинг: 0 / 0
05.10.2016, 06:51
    #39320661
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей Шм.skyANAпропущено...

Не менять текст запроса, а формировать его в зависимости от параметров. Собирать условие WHERE из отдельных кусочков.

Понял. Но неужели параметр не понимает, что если он DbNull.Value, то в запросе нужно автоматически прикинуться is null...( вопрос риторический..)
А Ваш программный код понимает что-то большее, чем в него заложено? :)
...
Рейтинг: 0 / 0
05.10.2016, 06:53
    #39320663
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей Шм.если параметр DbNull.Value, то менять для этого параметра сам текст запроса?
Есть несколько вариантов.
Универсальный:
Код: sql
1.
where (@nasp is null or nasp=@nasp) and ...


Если есть недопустимые значения для поля nasp (например 0) то можно так
Код: sql
1.
where nasp=nvl(@nasp,0) and ...
...
Рейтинг: 0 / 0
05.10.2016, 06:56
    #39320665
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Напутал немного, универсальный такой
Код: c#
1.
where ((@nasp is null and nasp is null) or nasp=@nasp) and ...
...
Рейтинг: 0 / 0
05.10.2016, 06:59
    #39320666
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
И второй не дописал
Код: sql
1.
where nvl(nasp,0)=nvl(@nasp,0) and ...
...
Рейтинг: 0 / 0
05.10.2016, 07:13
    #39320670
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Dima T, научите сейчас человека писать запросы, что не используют индексов, а его потом поругают за тормоза :)
...
Рейтинг: 0 / 0
05.10.2016, 07:40
    #39320676
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
skyANADima T, научите сейчас человека писать запросы, что не используют индексов, а его потом поругают за тормоза :)
Универсальный вариант 19744455 использует индекс.
По второму согласен, если индекс есть, то лучше так не писать.

С другой стороны у человека появится повод научиться смотреть и понимать план выполнения запроса :)
...
Рейтинг: 0 / 0
05.10.2016, 08:16
    #39320681
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Dima TskyANADima T, научите сейчас человека писать запросы, что не используют индексов, а его потом поругают за тормоза :)
Универсальный вариант 19744455 использует индекс.Будет Index Scan в лучшем случае.
...
Рейтинг: 0 / 0
05.10.2016, 08:19
    #39320682
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей КDima Tпропущено...

Универсальный вариант 19744455 использует индекс.Будет Index Scan в лучшем случае.
Проверь. У меня MS SQL в плане index seek пишет.
...
Рейтинг: 0 / 0
05.10.2016, 08:32
    #39320689
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Dima TАлексей Кпропущено...
Будет Index Scan в лучшем случае.
Проверь. У меня MS SQL в плане index seek пишет.Спорить не собираюсь.
...
Рейтинг: 0 / 0
05.10.2016, 08:46
    #39320695
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Dima TАлексей Кпропущено...
Будет Index Scan в лучшем случае.
Проверь. У меня MS SQL в плане index seek пишет.А ведь действительно это выдаёт на MSSQL 2012 Index Seek. Не знал.
Код: sql
1.
select * from T1 where (@v is null and Value is null) or Value = @v
...
Рейтинг: 0 / 0
05.10.2016, 09:12
    #39320708
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
@v ведь не меняется во время выполнения запроса, поэтому при @v = null можно упростить до
Код: c#
1.
Value is null 


иначе
Код: c#
1.
Value = @v 


Технически это не сложно сделать при разборе текста запроса. Думаю что-то подобное MSSQL делает во время построения плана запроса, откидывает заведомо ложные части условия.
...
Рейтинг: 0 / 0
05.10.2016, 09:22
    #39320712
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Много работал с такими запросами, дающими Index Scan, поэтому перепутал.
Код: sql
1.
select * from T1 where @v is null or Value = @v



А в данном случае реализуется паттерн сравнения необязательных значений, когда null == null is true , как у всех нормальных людей, а не как в древнем стандарте SQL, написанном странными людьми. Предполагаю, что данный паттерн тупо зашит в оптимизатор.
...
Рейтинг: 0 / 0
05.10.2016, 09:43
    #39320732
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей КМного работал с такими запросами, дающими Index Scan, поэтому перепутал.
Код: sql
1.
select * from T1 where @v is null or Value = @v


Какой seek может быть, если при @v = null твой запрос вырождается в такой
Код: c#
1.
select * from T1



Алексей Ккогда null == null is true , как у всех нормальных людей, а не как в древнем стандарте SQL
С null много граблей в SQL. Математики впилили в SQL троичную логику , а в алгоритмических ЯП двоичная осталась, кто не в курсе - наступает на грабли. Последний раз наступал на where ... not in (null)
...
Рейтинг: 0 / 0
05.10.2016, 09:50
    #39320739
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Алексей КМного работал с такими запросами, дающими Index Scan, поэтому перепутал.
Код: sql
1.
select * from T1 where @v is null or Value = @v


Недопонял сразу. Затестил с @v != null действительно в скан уходит.
Не такой уж и умный оптимизатор, как хотелось бы.
...
Рейтинг: 0 / 0
05.10.2016, 09:58
    #39320746
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
параметры и dbnull
Dima TНе такой уж и умный оптимизатор, как хотелось бы.К сожалению да. Если бы этот паттерн был учтён оптимизатором, то динамических запросов в хранимых процедурах у нас было бы на много меньше.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / параметры и dbnull / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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