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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2012, 15:45   #1
Toshibo
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 13
По умолчанию авто выбор Open и ExecSQL

Доброго времени суток.
У меня возникла проблема с обработкой запросов. На форме расположены DBedit(editSQL), ADOQuery1. Запрос вводится в DBedit и его значение присваивается ADOQuery1. Вопрос в следующем: как организовать выбор в использовании ADOQuery1.Open или ADOQuery1.ExecSQL в зависимости от запроса(Select или Insert, Delete)?
Пробовал через try...except, не выходит.
Код:
procedure TForm1.ButtonSQLClick(Sender: TObject);  {выполнить запрос}
begin
ADOQuery1.SQL.Add(editSQL.Text);
try
ADOQuery1.Active:=true
except
   ADOQuery1.ExecSQL;
end;
editSQL.Clear;
end;
Подскажите пожалуйста как решить проблему.
Toshibo вне форума Ответить с цитированием
Старый 22.10.2012, 15:48   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Первое слово в запросе какое? Select, Insert, Delete, наверно еще Update. Проверить какое слово нет ни какой возможности?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.10.2012, 16:01   #3
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Да, и код, приведенный выше должен работать, если в начале обработчика закрыть и очистить ADOQuery1
Код:
ADOQuery1.Active:=False;
ADOQuery1.SQL.Clear;
_SERGEYX_ вне форума Ответить с цитированием
Старый 22.10.2012, 16:20   #4
Toshibo
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 13
По умолчанию

Работает, если только 1ый вводимый запрос будет Select, а это уже не рабочая прогр.
Цитата:
Сообщение от Аватар Посмотреть сообщение
Первое слово в запросе какое? Select, Insert, Delete, наверно еще Update. Проверить какое слово нет ни какой возможности?
Запрос вводит пользователь, а значит нельзя предугадать его. А как проверить какое слово я думал узнать у Вас) Пробовал составить условие - безуспешно...
Toshibo вне форума Ответить с цитированием
Старый 22.10.2012, 16:30   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Работает, если только 1ый вводимый запрос будет Select, а это уже не рабочая прогр.
Это как? Поясните! Если следовать совету _SERGEYX_, то должно работать с try.. except (хоть это и кривовато!)

Цитата:
Запрос вводит пользователь, а значит нельзя предугадать его. А как проверить какое слово я думал узнать у Вас) Пробовал составить условие - безуспешно...
предугадывать ничего не надо.
Пишите что-то вроде такого:
Код:
var sSql : string;
begin
   sSql := Trim(AnsiUpperCase(editSQL.Text));
   if Pos('SELECT', sSql) = 1 then  begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Text := editSQL.Text;
      ADOQuery1.Open;
   end
   else
     if  (Pos('UPDATE', sSql) = 1) or 
           (Pos('DELETE', sSql) = 1) or 
              (Pos('INSERT', sSql) = 1) then begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Text := editSQL.Text;
      ADOQuery1.execSQL;            
     end
     else
       ShowMessage('Ошибка! Нераспознанный текст запроса!');
p.s. try .. except добавить по вкусу...

p.p.s. То, что пользователь написал в начале SELECT совсем даже не означает, что запрос будет корректным и правильно выполнится! для пробы рекомендую попробовать выполнить запрос вида select select
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.10.2012, 16:55   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Цитата:
Pos('UPDATE', sSql) = 1
Ну а если первое слово не из этих? declare к примеру ...

тут надо оформлять через executesql или подобное.
eval вне форума Ответить с цитированием
Старый 22.10.2012, 16:57   #7
Toshibo
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Это как? Поясните!
Если после запуска программы вводить запрос типа Insert, то выдает ошибку. Если после запуска вводить запрос Select - он работает, а после него и Insert начинает работать)
Спасибо большое, код работает.
Я правильно понял, что если изменить код,
Код:
begin
   sSql := Trim(AnsiUpperCase(editSQL.Text));
   if Pos('SELECT', sSql) = 1 then  begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Text := editSQL.Text;
      ADOQuery1.Open;
   end
   else
     begin
     ADOQuery1.Close;
      ADOQuery1.SQL.Text := editSQL.Text;
      ADOQuery1.execSQL;
     end;
то удастся отойти от конкретных команд манипулирования и в дальнейшем использовать команды определения данных(CREATE DATABASE,CREATE TABLE...) ведь они получается тоже без возврата результирующего набора данных?
Toshibo вне форума Ответить с цитированием
Старый 22.10.2012, 17:24   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

CREATE DATABASE,CREATE TABLE - вы такие запросы разрешаете делать пользователям? Круто. Уж, лучше сразу сделать красную кнопку DROP DATABASE
_SERGEYX_ вне форума Ответить с цитированием
Старый 22.10.2012, 17:29   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

на то есть политика юзверей, отрубите им такие привелегии и делов.
eval вне форума Ответить с цитированием
Старый 22.10.2012, 18:05   #10
Toshibo
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
CREATE DATABASE,CREATE TABLE - вы такие запросы разрешаете делать пользователям? Круто. Уж, лучше сразу сделать красную кнопку DROP DATABASE
Вопрос был не в этом...
Toshibo вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авто-копирование строки вниз при заполнении текущей (или авто-отображение скрытой ниже) bygaga Microsoft Office Excel 6 25.11.2011 14:46
Open GL, C++ Алина_258 Помощь студентам 6 18.06.2011 18:53
как реализовать авто-выбор S_Yevgeniy Помощь студентам 6 23.07.2010 10:39
win98 и ExecSQL Tanuska___:) БД в Delphi 17 02.07.2009 11:35
Два запроса - один ExecSQL EdNovice БД в Delphi 1 27.06.2007 17:33