Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429

Выполнение параметрических запросов

08.05.2010, 13:05. Показов 3053. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времени суток всем))
вот столкнулся с непонятной проблемой при выполнении параметрического запроса ADOQuery:
имеются 2 параметра t1 и t2, которые соответствуют, например, полям фамилия и имя.
на форме 2 edit'a
на кнопку "Выполнить запрос" я привязал такие действия:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
st:=''; 
adoquery1.Close; 
 if (form1.Edit1.Text<>'') then
   begin
     form1.ADOQuery1.Parameters.ParamByName('t1').Value :=form1.Edit1.Text;
     st:=st+ ' [Фамилия] like :t1 and';
   end;
 if form1.Edit1.Text='' then st:=st+'';
 
if form1.Edit2.Text<>'' then
   begin
     form1.ADOQuery1.Parameters.ParamByName('t2').Value :=form1.Edit2.Text;
     st:=st+' [Имя] like :t2';
   end;
 if form1.Edit2.Text='' then st:=st+'';
 
form1.ADOQuery1.SQL.Text:= 'select [Фамилия],[Имя]  from table where'+st;
 
try
  form1.AdoQuery1.Open;
except
   application.MessageBox('Не могу выполнить запрос','Ошибка',MB_OK);
 end;
если сначала данные для поиска введены в оба edit или в один из 2-х, параметрический запрос при
нажатии кнопки прекрасно выполняется.
НО!если же данные были введены в 2 поля и я выполнял запрос, а потом я одно поле отчистил,или же
были введены в одно поле,выполнен запрос при нажатии,а потом я это поле отчистил и ввёл даные в другое поле, выскакивает сообщение parametr not found и имя параметра, который соответствует последнему изменённому edit..
почему так происходит, никак не могу понять..помогите пожалуйста найти ошибку!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.05.2010, 13:05
Ответы с готовыми решениями:

Вывод параметрических запросов из dbgrid в excel
доброго времени суток. вот с чем столкнулся, вернее что не пойму как сделать: при нажатии на кнопку в dbgrid появляется результат...

FDMemTable выполнение SQL запросов
Всем привет! Друзья, подскажите плиз: задаю поля, заполняю динамически TFDMemTable данными, они никуда не пишутся - нужно для...

Последовательное выполнение SQL запросов
Доброго времени суток. Дельфи 7 + ADO + Dbf, драйвер доступа VFPOLEDB строка подключения: Provider=VFPOLEDB.1;Data...

4
 Аватар для arni
914 / 879 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
08.05.2010, 13:32
Во-первых, у вас висящий "and" в конце запроса, если заполняется лишь первый параметр, но не второй.
Во-вторых, зачем вообще использовать параметры, если текст запроса вы все равно собираете по кусочкам? Использовать и тот и другой подход одновременно - что может быть хуже?
В-третьих, в чем смысл такого кода:
Code
1
  if form1.Edit1.Text='' then st:=st+'';
В-четвертых, на этапе отладки, особенно когда оно работает черт знает как, подавлять эксепшен и вместо информативного сообщения видеть "Не могу выполнить запрос" - это для чего?
В-пятых, по логике вашего алгоритма, сначала появляются параметры, и только в конце - текст запроса. Моя логика подсказывает, что должно быть всё наоборот.
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
09.05.2010, 18:23  [ТС]
спасибо большое за ответ,arni !

Во-первых, у вас висящий "and" в конце запроса, если заполняется лишь первый параметр, но не второй.
нет, у меня,если строка заканчивается на d, то слово аnd обрезается
Во-вторых, зачем вообще использовать параметры, если текст запроса вы все равно собираете по кусочкам? Использовать и тот и другой подход одновременно - что может быть хуже?
абсолютно согласен)
В-третьих, в чем смысл такого кода:
Код 1 if form1.Edit1.Text='' then st:=st+'';
согласен, бесполезно))
В-четвертых, на этапе отладки, особенно когда оно работает черт знает как, подавлять эксепшен и вместо информативного сообщения видеть "Не могу выполнить запрос" - это для чего?
впринципе правильно, но это вроде не влияет на параметры?
В-пятых, по логике вашего алгоритма, сначала появляются параметры, и только в конце - текст запроса. Моя логика подсказывает, что должно быть всё наоборот.
вот здесь я не понял не много, Вы хотите сказать,что надо сначала написать
Delphi
1
form1.ADOQuery1.SQL.Text:= 'select [Фамилия],[Имя] from table where'+st;
а потом собирать сторку "st"?
0
 Аватар для arni
914 / 879 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
09.05.2010, 19:18
я бы написал примерно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const
  Query = 'select [Фамилия], [Имя] from table';
var
  SQL: string;
  procedure AddCondition(const FieldName, SearchValue: string);
  begin
    if SearchValue<>'' then
    begin
      if SQL<>'' then
        SQL:=SQL+' and ';
      SQL:=SQL+FieldName+' like '+AnsiQuotedStr(SearchValue, '''');
    end
  end;
begin
  ADOQuery1.Active:=False;
  SQL:='';
  AddCondition('[Фамилия]', Edit1.Text);
  AddCondition('[Имя]', Edit2.Text);
  if SQL='' then
    ADOQuery1.SQL.Text:=Query
  else
    ADOQuery1.SQL.Text:=Query+' where '+SQL;
  ADOQuery1.Open;
end;
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
09.05.2010, 20:00  [ТС]
спасибо большое, arni, действительно-так гораздо более универсальней
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2010, 20:00
Помогаю со студенческими работами здесь

Пакетное выполнение SQL-запросов
Доброго времени суток. Столкнулся с необходимостью многократного выполнения SQL-запроса с параметрами, но не знаю, как это реализовать в...

Подключение БД: Access, MSSQL и выполнение запросов
Привет всем. Как осуществлять подключение к БД в Delphi 6 и как исполнять запросы. Всем спасибо.

Отчет, составленный из параметрических запросов
Дамы и господа! Столкнулся с весьма интересной проблемой при составления отчетов из подчиненных отчетов, которые свою очередь формируются...

Хранение текста запросов в таблице. Как реализовать выполнение запросов с параметрами и Select?
День добрый! По тексту кода часто встречаются одни и те же фиксированные запросы, бывает длинные. Организовал их хранение в таблице, и по...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru