Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 15:01   #1
obolensky
Новичок
Джуниор
 
Регистрация: 15.01.2013
Сообщений: 5
По умолчанию Comdobox и запросы

Приветствую всех.

Подскажите, как совместить combox и запросы.

Вот мой вариант:
Код:
procedure TForm2.Button5Click(Sender: TObject);  
var s: string;
begin
if Combobox1.itemindex=0 then s:='SELECT * FROM tabl2 WHERE Plane = :p0';
if Combobox1.itemindex=1 then s:='SELECT * FROM tabl1 WHERE Data = :p0';
if Combobox1.itemindex=2 then s:='SELECT * FROM tabl1 WHERE Kills <= :p0';
if Combobox1.itemindex=3 then s:='SELECT * FROM tabl3 WHERE Country = :p0';
  try
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add(s);
    ADOQuery1.Parameters[0].Value := edit3.text;
    ADOQuery1.Active:=True;
  except
    on e:Exception do
  end;
end;

Данные считываю из edit, это значение присваивается параметру p0. В зависимости от выбранного combobox'а в ADOQuery передаётся нужный запрос с нашим параметром.

Как сделать тоже самое, но без параметров?

Последний раз редактировалось Stilet; 15.01.2013 в 16:53.
obolensky вне форума Ответить с цитированием
Старый 15.01.2013, 15:09   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

с параметром самое правильное решение, зачем ломать правильность?
единственное замечание это
if Combobox1.itemindex=0 then s:='SELECT * FROM tabl2 WHERE Plane = :Param';
if Combobox1.itemindex=1 then s:='SELECT * FROM tabl1 WHERE Data = :Param';
if Combobox1.itemindex=2 then s:='SELECT * FROM tabl1 WHERE Kills <= :Param';
if Combobox1.itemindex=3 then s:='SELECT * FROM tabl3 WHERE Country = :Param';

переделать в массив
Код:
const
Sql:array[0..3] of string=('SELECT * FROM tabl2 WHERE Plane = :Param',...);

ADOQuery1.Active:=false;
ADOQuery1.SQL.text:=Sql[Combobox1.itemindex];
ADOQuery1.Parameters[0].Value := edit3.text;
ADOQuery1.Active:=True;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 15.01.2013, 17:09   #3
obolensky
Новичок
Джуниор
 
Регистрация: 15.01.2013
Сообщений: 5
По умолчанию

Спасибо.

Делаю курсовую. Преподаватель попросил найти решение без параметров.
obolensky вне форума Ответить с цитированием
Старый 15.01.2013, 18:23   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Делаю курсовую. Преподаватель попросил найти решение без параметров.
Он издевается над Вами и учит Вас плохому. Так ему и передайте!

При формировании текста запрос с подстановкой значения прямо в текст запроса сразу выползут баги, связанные с различным представлением данных (форматы даты и времени, десятичные разделители и т.п.). Кроме того, нужно обязательно знать тип поля, которое сравнивается в запросе с подставленной константой...
а выглядеть это может примерно так:
Код:
s := '';
case Combobox1.itemindex of
  0:  s:='SELECT * FROM tabl2 WHERE Plane = '+Edit3.Text; {если Plane числовое поле и в Edit3.Text находится число}
  1:  s:='SELECT * FROM tabl1 WHERE Data = ?????? нужно знать типа поля Data и формат  представления
  2:  s:='SELECT * FROM tabl1 WHERE Kills <= '+Edit3.Text; {считаем что  Kills числовое поле и в Edit3.Text находится число}
  3:  s:='SELECT * FROM tabl3 WHERE Country = '+QuotedStr(Edit3.Text); {если поле текстовое}
end;
  try
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add(s);
    ADOQuery1.Active:=True;
  except
    on e:Exception do
  end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.01.2013, 03:31   #5
obolensky
Новичок
Джуниор
 
Регистрация: 15.01.2013
Сообщений: 5
По умолчанию

Спасибо большое Я делал почти тоже самое, но не использовал QuotedStr поэтому запросы не выполнялись.

Типа поля data - дата/время.
obolensky вне форума Ответить с цитированием
Старый 16.01.2013, 08:36   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Пожалуйста.

Цитата:
Типа поля data - дата/время.
вот об этом я и говорил - при подстановке этого поля могут быть проблемы у Вас.
А ещё хуже, когда (в силу настроек русской локали) у Вас на компьютере всё работает.
Запускаете программу на другом компьютере и получаете либо ошибку, либо (вообще жуть! ) ошибок нет, но дата '11.05.2012' будет записана в БД как 5 ноября 2012 года.

Попробуйте, например, сменить в настройках Windows формат представления даты и попытайтесь поработать с датой..

Хорошо, конечно, что у Вас только поиск. Но и то, что не найдётся нужная информация - в этом ничего хорошего нет!

Короче, вместо нормального корректного способа Вы пытаетесь сделать криво и ненадёжно. Привет преподавателю!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запросы Erstasya SQL, базы данных 9 11.12.2019 18:40
Запросы к бд. Predator199 PHP 10 26.08.2012 17:04
Запросы Jrcfyf БД в Delphi 0 20.04.2012 10:37
Запросы к БД limon PHP 7 28.11.2008 20:29
Запросы к БД xDjarx БД в Delphi 6 14.05.2008 17:04