Работа с ADO в Delphi. Часть 3

6 минут на чтение

Как и обещал и не долго думая написал пару запросов к БД MS Access, через которые можно добавлять данные в нашу БД, редактировать, удалять. Да конечно через запросы делать может немного сложнее для кого-то, но не для нас правда? Просто через запросы это все дело происходит быстрее. Например, чтобы удалить все данные нам из таблицы без запросов, то нам необходимо пройти все это дело циклом, а это время, а если записей в БД 200000, а через запрос, если это все дело организовать, то будет на много приятнее, красивее и конечно же быстрее, что немаловажно для нас. Здесь отличия у нас будут следующие:

  • вместо Active мы будем использовать ExecSQL
  • ну и конечно же будем использовать запросы

Кто забыл как мы добавляли, редактировали, удаляли и так далее записи в БД MS Access в Delphi через технологию ADO, сможет посмотреть вот в этой статье.

Все тоже самое, расположите нужные компоненты на форму, что мы уже проходили раньше и начнем писать нам нужные процедурки, обработчики и так далее. Начнем все с вывода наших данных при первоначальном запуске программы нашей. Для этого на событие нашей главной формы OnCreate напишем следующее

procedure TForm1.FormCreate(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

Здесь ничего нового для Вас нету, мы это уже делали в прошлой статье по Базам данных, так что комментировать тут ничего не буду, мы просто делаем запрос на все записи в таблице нашей — Student.

Далее мы добавим данные с помощью запроса, для этого на событие кнопки OnClick напишем следующий код

procedure TForm1.Button1Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Student(fio,oz) VALUES(''Иванов Иван Иванович'',10)');
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

Здесь у нас новый вид запроса INSERT INTO. Здесь мы указываем таблицу, в которую будем добавлять данные, а затем в скобках перечисляются поля, в которые будем вставлять данные, а затем VALUES и в скобках такое же количество данных, сколько указали и полей. Как видите ничего не сложно. И потом ExecSQL мы просто выполняем наш запрос, так как такие запросы надо выполнять, Active здесь не «прокатит«. Запрос делаем мы затем на вывод всех данных, в связи с тем, что после добавление, редактирования, удаления наш DBGrid не хочет обновляться, видно «глючность» ADO поэтому я решил на время решить эту проблему именно так.

Затем удалим выделенную строку в нашей таблицы, для этого, нам нужно получить уникальное число этой строки, чтобы удалять именно ее, а не что другое. Для этого я создал в нашей таблице поле id и задал ей тип Счетчик.

Далее на событие DBGrid OnCellClick я написал следующее

id:=ADOQuery1.Fields.Fields[0].AsInteger;

id - типа integer, не забудьте объявить.

Здесь мы получаем это самое уникальное поле, а уникальное оно будет всегда потому, что у id в таблице тип Счетчик и он соответственно никогда не будет повторяться.

Так когда мы получили уникальное поле, теперь можно и удалить нам нужную запись

procedure TForm1.Button2Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETE FROM Student WHERE id=:pid');
ADOQuery1.Parameters.ParamByName('pid').Value:=id;
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

Здесь мы запросом DELETE удаляем запись по условию id=:pid. А pid мы присваиваем значение, которое получаем по клику на наш DBGrid. Здесь немного поясню в TAdoQuery есть свойство Parametrs, там нам необходимо добавить параметр новый, указать его имя и тип, в данном случае я выбрал тип — ftInteger. Затем  после запроса мы этот параметр заполняем, а в самом запросе используем, то есть чтобы удалили именно текущую запись, удаляем по условию где задаем с помощью WHERE.

Удалить все данные еще проще

procedure TForm1.Button3Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETE FROM Student');
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

Здесь мы не указываем никаких параметров ничего просто удаляем все записи, вот про что я говорил, что запросом удалить все записи намного быстрее чем через цикл.

И наконец отредактируем данные вот так

procedure TForm1.Button4Click(Sender: TObject);
begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE Student SET fio=''Петров Петр Петрович'',oz=7 WHERE id=:pid');
ADOQuery1.Parameters.ParamByName('pid').Value:=id;
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student');
ADOQuery1.Active:=True;
except
on e:Exception do
end;
end;

Здесь используется конструкция UPDATE SET, указываем таблицу где обновлять данные через SET указываем поля, которые обновляем и сразу через «=» задаем им новые значения, ничего сложного, ну и конечно нам надо отредактировать именно выделенную запись (текущую), поэтому также задаем условие WHERE id=:pid. id мы один раз на OnCellClick получаем, поэтому он у нас в любом случае будет чему-то равняться. Ну что как видите ничего сложного. Дальше мы рассмотрим как работать в ADO с BLOB-полями, их преимущества и многое другое.

Исходники статьи качаем тут

Facebook Vk Ok LinkedIn Telegram

Похожие записи:

Всем здравствуйте, в этой статье я хотел бы снова обратить внимание на Базы данных, а в частности работа с Базами данных по технологии ADO. Когда пользователь создает приложение на Delphi, работающего с СУБД, к которой присоединяется по технологии ADO, то к фа...
Всем привет, и вот мой первый урок, думаю урок полезный, так как работа с базами данных в Delphi очень важно, а тем более Access на мой взгляд самая легкая база данных, с которой можно работать в Delphi. В этой статье я расскажу Вам как эту самую Базу данных A...
Ну вот не долго думая, подошла вторая часть по работе с ADO в DELPHI на примере БД — MS Excel. В данной статье мы рассмотрим добавление и редактирование данных, так как с удалением тут возникли проблемы, в связи с тем, что данный драйвер не поддерживает удален...