powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / параметры и dbnull
24 сообщений из 24, страница 1 из 1
параметры и dbnull
    #39320269
Алексей Шм.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите разобраться. Выбираю все уникальные сочетания элементов, составляющие адрес( так получилось, что в бд под разными 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
параметры и dbnull
    #39320372
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Шм., (nkorp=@nkorp or @nkorp is null)
...
Рейтинг: 0 / 0
параметры и dbnull
    #39320643
Алексей Шм.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
параметры и dbnull
    #39320644
Алексей Шм.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть мне нужно, чтобы выбрались строки (средняя строка), где квартира null. В параметр и переадается DbNull.Value, но запрос не отрабатывается, не находит записи. При добавлении or.. запрос расширяет условия поиска, что мне не нужно.
...
Рейтинг: 0 / 0
параметры и dbnull
    #39320654
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Шм., если у Вас значение параметра DBNull.Value, то в запросе должно быть просто nkorp IS NULL без всяких OR.
...
Рейтинг: 0 / 0
параметры и dbnull
    #39320655
Алексей Шм.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Шм., если у Вас значение параметра DBNull.Value, то в запросе должно быть просто nkorp IS NULL без всяких OR.

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

Пока работает так
Код: 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
параметры и dbnull
    #39320659
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Шм.skyANAАлексей Шм., если у Вас значение параметра DBNull.Value, то в запросе должно быть просто nkorp IS NULL без всяких OR.

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


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

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

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

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


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

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

Универсальный вариант 19744455 использует индекс.Будет Index Scan в лучшем случае.
Проверь. У меня MS SQL в плане index seek пишет.
...
Рейтинг: 0 / 0
параметры и dbnull
    #39320689
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TАлексей Кпропущено...
Будет Index Scan в лучшем случае.
Проверь. У меня MS SQL в плане index seek пишет.Спорить не собираюсь.
...
Рейтинг: 0 / 0
параметры и dbnull
    #39320695
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
параметры и dbnull
    #39320708
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@v ведь не меняется во время выполнения запроса, поэтому при @v = null можно упростить до
Код: c#
1.
Value is null 


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


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



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


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


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