|
00.2 Уч-мет пос МПиС d4 (1). Лабораторная работа Формирование статистической таблицы с возможностью сортировки, фильтрации и группировки данных 4
Лабораторная работа № 5. Подключение к локальной базе данных зерез ADO
Как базу данных Access подключить к Delphi?
Для начала запустим Delphi. Создадим новое приложение File New Application. На главную форму добавляем следующие компоненты:1
TDBGrid TDataSource TADOConnection TADOQuery
Итак, теперь по компонентам:
TDBGrid (на вкладке DataControls) предназначен для отображения данных БД; TDataSource (на вкладке Data Access) предназначен для связи сетки отображения данных с БД; TADOConnection (на вкладке ADO) предназначен для подключения БД по определенному провайдеру; TADOQuery (на вкладке ADO) предназначен для получения результатов из нашей БД.
Далее необходимо создать базу данных в MS Access с полями:
ФИО – строковый тип данных (fio); оценка – числовой тип данных (oz).
Даем имя Student, сохраним БД, заполните таблицу какими-нибудь данными. Теперь «свяжим» необходимые компоненты, которые находятся на главной форме:
TADOQuery в свойстве Connection связываем с TADOConnection и из выпадающего списка выбираем имя компонента; TDataSource в свойстве DataSet связываем с TADOQuery и из выпадающего списка выбираем имя компонента; TDBGrid в свойстве DataSource связываем с TDatasource и из выпадающего списка выбираем имя компонента.
Все свойства, с которыми связывали компоненты, все красноватого цвета, так что не ошибетесь.
Далее выделяем компонент TADOConnection и в свойстве LoginPromt ставим False. Делаем для того, чтобы при подключении к БД не запрашивался пароль, дальше в свойстве ConnectionString нажимаем на кнопку с …, появляется окно (рис. 11).
Рис. 11. Окно подключения к внешней базе данных
В окне нажимаем на кнопку Build…, появляется (рис. 12).
Рис. 12. Окно выбора типа подключения
В данном окне выбираем провайдера, а именно Microsoft Jet 4.0 OLE DB Provaider и нажимаем кнопку Далее.
Рис. 13. Окно администрирвоания
В окне указываем путь к БД и имя пользователя (по умолчанию Admin). Если БД находится в корневом каталоге с программой, то в данном поле достаточно указать имя с расширением, а если еще в подкаталоге, то указывается примерно так BD\mydb.mdb (рис 13).
Осталось нажать кнопку ОК и в свойстве компонента TADOConnection – Mode выбрать из выпадающего списка cmShareDenyNone.
Подключение организовано теперь осталось только отобразить данные в таблице. Для этого в событии главной формы OnCreate напишем следующее: procedureTForm1.FormCreate(Sender:TObject);
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student');
ADOQuery1.Active:=True;
end; Запрашиваем поля с данными и активируем запрос, чтобы данные отобразились с помощью свойства Active. Рассмотрим далее работу с компонентами, а также некоторые свойства. Попробуем сделать небольшие запросы к БД и добавлять, редактировать информацию, удалять и перемещаться в таблице по записям.
Воспользуемся компонентом TDBGrid. Для удобства нажмем двойным щелчком левой кнопкой мыши на компоненте и в появившемся окне создаем 2 поля, нажав на кнопку Add new. Затем, выбрав первой поле в свойстве FildName, прописываем вручную fio, в том же свойстве для второго поля прописываем oz. Затем переходим в свойство Title раскрываем и в подсвойстве Caption для 1-го поля указываем ФИО, а для 2-го поля указываем Оценка. Затем в свойстве компонента TDBGrid раскрываем свойство Options и в подствойстве dgEditing установлеваем False, а в подсвойстве dgRowSelect установливаем True. dgEditing - запрещаем редактирование в самой таблице, а dgRowSelect этим свойством выделяется вся строка в таблице. На главную форму приложения «установливаем» следующие компоненты (рис. 14).
Рис. 14. Полученная форма
Далее на кнопку Добавить напишем следующий код: procedure TForm1.Button1Click(Sender: TObject);
begin
try
if (Trim(Edit1.Text)='') or (Trim(Edit2.Text)='') then
begin
exit;
end;
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
ifApplication.MessageBox('Delete?','ADO',MB_YESNO)=IDYES then
begin
ADOQuery1.Delete;
end;
except
on e:Exception do
end;
end; Здесь метод Delete, то есть удаляем запись из таблицы на которой стоит указатель. На кнопку Редактировать пропишем следующий код:
procedureTForm1.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: try
ADOQuery1.Active:=True;
ADOQuery1.Post;
except
on e:Exception do
end; Метод Post сохраняет измененные данные в таблице.
Далее идут у кнопки с небольшими запросами, на кнопке Вывести всех с оценками 10 по событию OnClick добавим следующий код: try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student WHERE oz=10');
ADOQuery1.Active:=True;
except
on e:Exception do
end; Здесь идет обычный запрос с условием, условие задается с помощью конструкции Where. Здесь указываем какие записи выводить. Метод Clear - очищает все, что было в SQL, а ADD - добавляет текст SQL.
Далее на кнопке Вывести все фамилии, в которых присуствует Иван добавим следующий код: try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student WHERE fio LIKE ''%Иван%''');
ADOQuery1.Active:=True;
except
on e:Exception do
end; Здесь в SQL-синтаксисе LIKE и конструкции %%, которая ищет совпадения Иван в поле fio во всех записях. Выводим все записи таблицы, для этого достаточно написать следующий код: try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student');
ADOQuery1.Active:=True;
except
on e:Exception do
end; Также во вкладке ADO есть хороший компонент TADOTable, который работает по такому же принципу, как и TADOQuery, но в TADOTable нельзя формировать SQL-запросы, поэтому предпочтительно TADOQuery.
Несколько запросов к БД, через которые можно добавлять данные, редактировать и удалять. Отличие - вместо 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; Здесь ничего нового нет. Далее добавим данные с помощью запроса, для этого на событие кнопки OnClick напишем следующий код: begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERTINTO 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;
Новый вид запроса INSERTINTO. Указываем таблицу, в которую будем добавлять данные, а затем в скобках перечисляются поля, в которые будем вставлять данные, а затем VALUES и в скобках такое же количество данных, сколько указали и полей. Потом ExecSQL выполняем запрос, так как такие запросы надо выполнять, Active не задействован. Запрос делаем на вывод всех данных, в связи с тем, что после добавления, редактирования, удаления наш DBGrid не хочет обновляться.
Затем удалим выделенную строку в таблице, для этого, необходимо получить уникальное число этой строки. Для этого создадим в таблице поле id, тип Счетчик. Далее на событие DBGridOnCellClick пропишем: id:=ADOQuery1.Fields.Fields[0].AsInteger; id – типа integer, не забудьте объявить.
Здесь получаем уникальное поле, а уникальное оно будет всегда потому, что у id в таблице тип Счетчик и он соответственно никогда не будет повторяться. Так, когда получили уникальное поле, теперь можно и удалить нужную запись: begin
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETEFROM 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; Ззапросом DELETE удаляем запись по условию id=:pid. А pid присваиваем значение, которое получаем по клику на DBGrid. В TAdoQuery есть свойство Parametrs, где необходимо добавить новый параметр, указать имя и тип, в данном случае выбран тип – ftInteger. Затем, после запроса этот параметр заполняем, а в самом запросе используем, то есть чтобы удалили именно текущую запись, удаляем по условию где задаем с помощью WHERE.
Удалить все данные еще проще:
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETEFROM Student');
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Student');
ADOQuery1.Active:=True;
except
on e:Exception do
end; Не указываем никаких параметров ничего просто удаляем все записи, что запросом удалить все записи намного быстрее чем через цикл.
И наконец отредактируем данные:
try
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATEStudentSETfio=''Петров Петр Петрович'',oz=7 WHEREid=: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; Здесь используется конструкция UPDATE SET, указываем таблицу где обновлять данные через SET указываем поля, которые обновляем и сразу через «=» задаем новые значения, затем надо отредактировать выделенную запись (текущую), поэтому также задаем условие WHERE id=:pid. Id и OnCellClick. Дальше рассмотрим, как работать в ADO с BLOB-полями. Для начала создайте БД в MS Access и какую-нибудь таблицу, и в таблице обязательно должно быть поле с типом данных - Поле OLE-объекта. В этом поле и будут храниться файлы - картинки. Сделаем подключение к нашей БД. Затем на OnCreate формы активируем компонент запросов:
|
|
|