57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
1

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

08.05.2010, 13:05. Показов 2822. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2010, 13:05
Ответы с готовыми решениями:

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

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

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

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

4
912 / 877 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
08.05.2010, 13:32 2
Во-первых, у вас висящий "and" в конце запроса, если заполняется лишь первый параметр, но не второй.
Во-вторых, зачем вообще использовать параметры, если текст запроса вы все равно собираете по кусочкам? Использовать и тот и другой подход одновременно - что может быть хуже?
В-третьих, в чем смысл такого кода:
Код
  if form1.Edit1.Text='' then st:=st+'';
В-четвертых, на этапе отладки, особенно когда оно работает черт знает как, подавлять эксепшен и вместо информативного сообщения видеть "Не могу выполнить запрос" - это для чего?
В-пятых, по логике вашего алгоритма, сначала появляются параметры, и только в конце - текст запроса. Моя логика подсказывает, что должно быть всё наоборот.
1
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
09.05.2010, 18:23  [ТС] 3
спасибо большое за ответ,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
912 / 877 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
09.05.2010, 19:18 4
я бы написал примерно так:
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
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
09.05.2010, 20:00  [ТС] 5
спасибо большое, arni, действительно-так гораздо более универсальней
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2010, 20:00
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru