Проблема с SQL запросом





Здравствуйте!
C#
Создал базу данных в Аксессе, провёл связи между таблицами так, как мне надо, создал запрос на выборку - тоже такой, какой мне нужен. Выборка(либо по И, либо по ИЛИ) идёт по 7 полям(параметрам). Так вот, у меня параметры зависят от наполнения текстбоксов в программе, но когда текстбокс пустой - прога вылетает с эксепшном "Параметр такой-то не имеет значения по умолчанию" - ругается так всякий раз, когда один(или несколько) текстбоксов пустые.

Запрос выглядит так:
[code=sql]
SELECT tindexes.who_not, twho.who, tindexes.act_not, tact.act, tindexes.obj_not, tobj.obj, tindexes.kind_not, tkind.kind, tindexes.gde_not,
tgde.gde, tindexes.kogda_not, tkogda.kogda, tother.other
FROM tother INNER JOIN (tkogda INNER JOIN (tgde INNER JOIN (tkind INNER JOIN (tobj
INNER JOIN (twho INNER JOIN (tact INNER JOIN tindexes ON tact.id = tindexes.id_act) ON twho.id = tindexes.id_who) ON tobj.id = tindexes.id_obj)
ON tkind.id = tindexes.id_kind) ON tgde.id = tindexes.id_gde) ON tkogda.id = tindexes.id_kogda) ON tother.id = tindexes.id_other
WHERE (((tindexes.who_not)=False) AND ((twho.who)=@who) OR ((tindexes.act_not)=False) AND ((tact.act)=@act) OR ((tindexes.obj_not)=False) AND
((tobj.obj)=@obj) OR ((tindexes.kind_not)=False) AND ((tkind.kind)=@kind) OR ((tindexes.gde_not)=False) AND ((tgde.gde)=@gde) OR
((tindexes.kogda_not)=False) AND ((tkogda.kogda)=@kogda) OR ((tother.other)=@other))
[/code]

При помощи ArrayList я смог реализовать правильную подстановку частей запроса(в зависимости о того - пустой(ые) текстбокс(ы) или нет), но только во второй половине(после WHERE), но до WHERE это сделать, помоему, нереально(изза геморроя с записями в скобках).

Так вот, вопрос такой - как заставить её корректно работать(корректно и без проблем делать выборку по набранным параметрам) при некоторых пустых текстбоксах?

Ответы (4)

RSS
+
0
По правилам сравнения данных значение null не равно значению null . Скорее всего идет соединение таблиц по полям, которые содержат значения null.  Пустое значение - это тип значения "Empty". Такого в Access нет.  Поэтому надо либо не объединять таблицы по полям допускающим null, либо определить для таких полей значение по умолчанию.
avatar

r-ergey-ibalnikov

  • 19 июля 2009, 13:04
+
0
Я бы попробовал вот так

SELECT tindexes.who_not, twho.who, tindexes.act_not, tact.act, tindexes.obj_not, tobj.obj, tindexes.kind_not, tkind.kind, tindexes.gde_not,
tgde.gde, tindexes.kogda_not, tkogda.kogda, tother.other

FROM tother,
    tkogda,
    tgde,
    tkind,
    tobj,
    twho,
    tact,
    tindexes
WHERE 1=1
 and tact.id   = tindexes.id_act
   and (@act is null or tact.act = @act)
 and twho.id   = tindexes.id_who
   and (@who is null or twho.who = @who)
 and tobj.id   = tindexes.id_obj
   and (@obj is null or tobj.obj = @obj)
 and tkind.id  = tindexes.id_kind
   and (@kind is null or tkind.kind = @kind)
 and tgde.id   = tindexes.id_gde
   and (@gde is null or tgde.gde=@gde)
 and tkogda.id = tindexes.id_kogda
   and (@kogda is null or tkogda.kogda=@kogda)
 and tother.id = tindexes.id_other
   and (@other is null or tother.other=@other)
avatar

ivq

  • 29 июля 2009, 14:47
+
0
Было бы это php :) гемора бы небыло, там все делается таким образом WHERE $id=$ss OR $id=$sd AND $ii=$sd  воть :)
avatar

kanados

  • 31 июля 2009, 21:11
+
0
Если текстбокс пустой, зачем его включать вообще в запрос? Ведь он не организует никакого условия, так как не содержит значения. Мне кажется самым разумным - оптимизировать в эту сторону: помимо всего, вы еще существенно "разгрузите" текст запроса
avatar

atealus

  • 28 июля 2009, 04:07

Вопрос закрыт