nude celebrities
nude celebrities
nude celebrities
Версия для печати

Работа с ADO в Delphi

Оцените материал
(23 голосов)


Работа с ADO в Delphi

Всем привет, и вот мой первый урок, думаю урок полезный, так как работа с базами данных в Delphi очень важно, а тем более Access на мой взгляд самая легкая база данных, с которой можно работать в Delphi. В этой статье я расскажу Вам как эту самую Базу данных Access подключить в Delphi, ну а в последующих статьях мы рассмотрим как добавлять информацию, редактировать, удалять и так далее, и Вы убедиться потом что ничего сложного в этом нету. Для начала запустим Delphi. Создадим новое приложение File-New-Application, думаю здесь объяснять долго ничего не надо. Что делаем далее, на нашу главную форму «ставим» следующие компоненты

· TDBGrid

· TDataSource

· TADOConnection

· TADOQuery

Итак теперь по компонентам:

· TDBGrid находиться на вкладке DataControls, предназначен для отображения данных БД в нашей программе (приложении)

· TDataSource находится на вкладке Data Access, предназначен для связи нашей сетки отображения данных, с самой БД

· TADOConnection находится на вкладке ADO, предназначен для подключения нашей БД по определенному провайдеру

· TADOQuery находится также на вкладке ADO, предназначен для получение нужных результатов из нашей БД.

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

· ФИО – строковый тип данных (fio)

· оценка – числовой тип данных (oz)

И назову ее Student, сохраним нашу БД в нужное место и продолжим дальше, ах да ну и заполните вашу таблицу какими-нибудь данными. А теперь мы «свяжим» все необходимые компоненты, которые находятся на нашей главной форме

· TADOQuery в свойстве Connection я «связываю» с TADOConnection из выпадающего списка я выбираю имя данного компонента.

· TDataSource в свойстве DataSet я «связываю» с TADOQuery из выпадающего списка я выбираю имя данного компонента

· TDBGrid в свойстве DataSource я «связываю» с TDatasource из выпадающего списка я выбираю имя данного компонента.

Вот и все пол-дела сделано!!! Все свойства, с которыми мы связывали компоненты, они все ну красноватого цвета, так что Вы не ошибетесь.

Далее выделяем компонент TADOConnection и в свойстве LoginPromt ставим на False. Это делаем для того, чтобы при подключении к БД у нас не запрашивался пароль, дальше в свойстве ConnectionString нажимаем на кнопку с «…» и появляется окно следующего вида:

1

В данном окне нажимаем на кнопку «Build…» и появляется окно следующего вида:

2

В данном окне мы выбираем провайдера, а именно Microsoft Jet 4.0 OLE DB Provaider и нажимаем кнопку «Далее».

3

В данном окне мы указываем путь к нашей БД и имя пользователя по умолчанию Admin. Если ваша БД находится в корневом каталоге с программой, то в данном поле достаточно указать ее имя с расширением, а если еще в подкаталоге, то указывается это примерно так BD\mydb.mdb

Почти все закончили осталось только нажать кнопку «Ок» и в свойстве компонента TADOConnection – Mode выбрать из выпадающего списка cmShareDenyNone.

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

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

Что мы в этом коде делаем, обычный запрос к нашей таблице Student, как мы и называли ее. То есть мы запрашиваем у нее этим запросом все поля с данными и после этого просто активируем наш запрос, чтобы данные отобразились с помощью свойства Active.

Сейчас мы рассмотрим примитивную работа с данными компонентами, а также некоторые свойства их. Кроме это попробуем сделать небольшие запросы к БД и добавлять, редактировать информацию, удалять и перемещаться в таблице по записям. Мы все прекрасно помним компонент TDBGrid. Так вот в нем для удобство я нажал двойным щелчком левой кнопкой мыши и в появившемся окне я создал 2 поля, нажав на кнопку Add new. Затем выбрав первой поле в свойстве FildName я прописал вручную fio, в том же свойстве для второго поля я прописал oz. Затем я перешел в свойство Title раскрыл его и в подсвойстве Caption для 1-го поля я указал ФИО, а для 2-го поля я указал Оценка. Затем в свойстве компонента TDBGrid я раскрыл свойство Options и в подствойстве dgEditing я установил False, а в подсвойстве dgRowSelect я установил True. dgEditing - я запретил редактирование в самой таблице, а dgRowSelect этим свойством выделяется вся строка в таблице. На главную форму нашего приложения я «установил» следующие компоненты и вот что у меня получилось

4

Далее на кнопку «Добавить» я написал следующий код

procedure TForm1.Button1Click(Sender: TObject);
begin
 try
   if (Trim(Edit1.Text)='') or (Trim(Edit2.Text)='') then exit;
  ADOQuery1.Insert;
  ADOQuery1.FieldByName('fio').AsString:=Edit1.Text;
  ADOQuery1.FieldByName('oz').AsInteger:=StrToInt(Edit2.Text);
  Edit1.Clear;
  Edit2.Clear;
 except
  on e:Exception do
 end;
end;

Здесь самой главное – это Insert. То есть это означает, что мы вставляем новую строку в нашу таблицу. FieldByName - указываем в какое поле мы вставляем информацию и AsType - необходимо указать тип наших данных, которые мы вставляем.

На кнопку «Удалить» я написал следующий код

procedure TForm1.Button2Click(Sender: TObject);
begin
 try
  if Application.MessageBox('Delete?','ADO',MB_YESNO)=IDYES then
   begin
   ADOQuery1.Delete;
   end;
 except
  on e:Exception do
 end;
end;

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

На кнопку «Редактировать» я написал следующий код

procedure TForm1.Button3Click(Sender: TObject);
begin
  try
   ADOQuery1.Edit;
   ADOQuery1.FieldByName('fio').AsString:=Edit1.Text;
   ADOQuery1.FieldByName('oz').AsInteger:=StrToInt(Edit2.Text);
  except
   on e:Exception do
  end;
end;

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

Перед тем как редактировать я на событие DBGrid - OnCellClick написал получение данные в наши поля, чтобы мы могли их отредактировать потом, то есть чтобы пользователь видел какие данные там раньше находились, до редактирования

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  try
   Edit1.Text:=ADOQuery1.FieldByName('fio').AsString;
   Edit2.Text:=IntToStr(ADOQuery1.FieldByName('oz').AsInteger);
  except
   on e:Exception do
  end;
end;

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

На кнопку «Вниз» я написал следующий код

ADOQuery1.Last;

Метод Last означает, что мы переместимся на последнюю запись нашей таблицы

На кнопку «Обновить» я написал следующий код

ADOQuery1.Refresh;

Метод Refresh означает, что мы обновляем данные в таблице и соответственно они обновляются и перед нами

На кнопку «Вверх» я написал следующий код

ADOQuery1.First;

Метод First означает, что мы перейдем на первую запись в нашей таблице

На кнопку «Далее» я написал следующий код

ADOQuery1.Next;

Метод Next означает, что мы будем проходить последовательно по записям вниз

На кнопку «Назад» я написал следующий код

ADOQuery1.Prior;

Метод Prior означает, что мы будем проходиться последовательно по записям нашей таблицы вверх

Далее после редактирования, добавления данных нам необходимо их сохранить, вот поэтому и существует у нас кнопку «Сохранить» на событие OnClick, которой я написал следующий код

procedure TForm1.Button9Click(Sender: TObject);
begin
  try
   ADOQuery1.Active:=True;
   ADOQuery1.Post;
  except
   on e:Exception do
  end;
end;

Здесь все просто метод Post сохраняет все измененные данные в нашей таблице.

Далее идут у нас кнопку с небольшими запросами, на кнопке «Вывести всех с оценками 10» по событию OnClick я написал следующий код

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

Здесь у нас идет обычный запрос с условием, условие у нас задается с помощью конструкции Where. Здесь мы и указываем какие записи выводить. Метод Clear - очищает все что было в SQL, а ADD - добавляет текст SQL.

Далее на кнопке «Вывести все фамилии, в которых присутствует Иван» я написал следующий код

procedure TForm1.Button11Click(Sender: TObject);
begin
  try
   ADOQuery1.SQL.Clear;
   ADOQuery1.SQL.Add('SELECT * FROM Student WHERE fio LIKE ''%Иван%''');
   ADOQuery1.Active:=True;
  except
   on e:Exception do
  end;
end;

Здесь у нас уже новенькое в SQL-синтаксисе LIKE и конструкции %%, да именно эта конструкция и ищет совпадения Иван в поле fio во всех записях. И наконец, выводим все записи нашей таблиц для этого достаточно написать следующий код

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

Также во вкладке ADO есть хороший компонент TADOTable, который работает по такому же принципу как и TADOQuery, но в TADOTable нельзя формировать SQL-запросы, поэтому я предпочитаю TADOQuery. Дальше поговорим про БД, я напишу, как добавлять, редактировать и удалять данные с помощью SQL-запросов.

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

· вместо Active мы будем использовать ExecSQL

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

Все тоже самое, расположите нужные компоненты на форму, что мы уже проходили раньше и начнем писать нам нужные процедуры, обработчики и так далее. Начнем все с вывода наших данных при первоначальном запуске программы нашей. Для этого на событие нашей главной формы 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 получаем, поэтому он у нас в любом случае будет чему-то равняться. Ну что как видите ничего сложного.

Прочитано 56980 раз