Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы IT / ЛабаDelphi11.doc
Скачиваний:
90
Добавлен:
06.02.2015
Размер:
522.24 Кб
Скачать

3 Работа с Базой Данных в Delphi

Чтобы создать элементарное приложение в Delphiработающее с БД требуется 2 основных компонента:TableиDataSource, а также дополнительные компоненты элементов управления. Ниже приведенная схема наглядно объясняет взаимодействие приложенияDelphiи базы данных.

ОбъектTableсоединяет ваше приложениеDelphiс псевдонимом базы данных.

Объект DataSourceявляется посредником междуTableи остальными объектами в программе. Он получает данные изTableи передаёт их объектам, и наоборот может передавать данные из объектов в БД также черезTable. ВзаимодействиеTableиDataSourceкоординируется программойBDEкоторая производит операции чтения и записи БД в нужном формате.

Объекты элементов управления данными в БД DBNavigator DBGird и т.д. черезDataSourceмогут получать и управлять информацией из БД.

DBGrid– это таблица для отображения базы данных в табличном виде.

Задание 3.1. Средствами Delphi откроем созданную Базу Данных «Сотрудники».

Запустите Delphi7. Создайте новый проект.

Первое что нужно сделать, это скинуть на форму компонент Table1. ВDelphi6 и в более ранних версиях он находился на вкладкеDataAccess, а вDelphi7 находится на вкладкеBDE.

Затем сбросьте на форму DataSource1 c вкладки DataAccess, а также DBNavigator1 и DBGird1 с вкладки DataControls.

Теперь настройте объект Table1 на БД через её псевдоним. Для этого установите его свойствоDatabaseNameна псевдоним Sotrudnik, а свойствоTableNameустановите на файл sotrudink.DB.

Далее подключим компонент DataSource1 к объекту(таблице)Table1. Установите дляDataSource1 его свойствоDataSetнаTable1.

Осталось последнее. Подключить объекты элементов управления к БД. Для этого установите для DBNavigator1 его свойство DataSourceвDataSource1, то же самое сделайте дляDBGird1. Вот и всё, теперь и объекты управления настроены на БД и могут на неё влиять.

Рис. 17Без помощи мастера БД создаём приложение работающее с БД– Sotrudnik

Теперь даже не запуская программу можно отобразить данные из БД в компоненте DBGird1. Для этого уTable1 установите значение свойстваActiveвTrue. Ваша таблицаDBGird1 заполнится данными из БД.

Рис. 18 В режиме программирования, не запуская приложение отображаем данные вDBGird1 установивTable1.ActiveвTrue

Для того чтобы Table1 активизировался можно не только установитьTable1.ActiveвTrueно и применить следующий оператор:Table1.open. Проверьте это. Для этого уTable1 установите значение свойстваActiveвFalse. Данные перестанут отображаться, а в обработчикеonCreateформы напишите:

Table1.open; // Открывает БД и таблицу

Запустите программу. Данные из БД будут отображаться в таблице. Вернитесь в РП.

Снова для Table1 установитеActiveвTrue. Аналогично для закрытия таблицыTable1.close.

Теперь скиньте ещё 6 компонентов labelна каждом из них напишите имена полей БД и напротив каждого компонентаlabelпоместите по одному– компоненту классаTDBEdit(элементу управления) позволяющий ввод, вывод и редактирование информации.

Причем для каждого компонента класса TDBEditустановите его свойствоDataSourceвDataSource1, а также свойствоDataFieldна соответствующее полеNameилиSurnameилиAgeи т.д.

Рис. 19 Добавляем компоненты классаTDBEdit

Запустите программу. Перемешайтесь по БД. Но старайтесь не менять данные. Выбранные Данные будут отображаться также и в компонентах Edit.Вернитесь в РП.

Задание 3.2. В Базе Данных «Сотрудники» создадим вычисляемое виртуальное поле.

Виртуальное поле можно создать в вашем приложении, отображать его в таблице. Реально оно не будет существовать в БД. Виртуальное поле требуется для отображения результатов вычислений проведенных с данными из реальных полей БД.

Рис. 20Список полей доступных

компоненту Table1

Щелкните двойным щелчком на объекте Table1. Откроется редактор полей.

Здесь приводится список полей которые будут доступны Table1.

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

Удалите ряд полей, а затем щелкните правой кнопкой и выберите

Addallfields, все поля снова будут доступны.

(При данных действиях часто у Table1 устанавливается значение свойстваActiveвFalse, поэтому меняйте его наTrue).

Создадим виртуальное поле с именем Summa. Ради простоты в него просто будем заносить сумму записей полейAgeиWeight. Щелкните двойным щелчком на объектеTable1. Откроется редактор полей. Щелкните правой кнопкой и выберитеNewField. Заполните поля ввода как на рисунке ниже:

Рис. 21Создаём вычисляемое полеSumma

с использованием диалогового окна NewField

Здесь Summaэто имя поля, а компонент представляющий это поле в приложении имеет имяTable1Summa.Calculated– означает что поле вычисляемое. НажмитеOK. Теперь в редакторе полей будет отображаться данное поле.

Для того чтобы оно также стало отображаться в таблице DBGirdещё раз установите значение свойстваTable1.ActiveвTrue.

Далее выберите в ObjectInspectorTable1Summaи создайте обработчик событияonGetText, напишите там следующее:

Text:=FloatToStr(Table1Weight.Value+ Table1Age.Value);

Рис. 22В полеSummaсодержится сумма значений полейWeightиAge

Запустите программу. Посмотрите на поле Summa, там должна быть сумма значений полейWeightиAge. Можете изменять значения в поляхWeightиAge, эти изменения сразу отобразятся в полеSumma.Вернитесь в РП.

Событие onGetText наступает при обращении к свойствамDisplayTextилиTextобъекта наследника классаTDataSet, в данном случае объектаTable1.

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

Данный обработчик позволяет изменить форму отображения значения поля Value, т.е. изменить свойстваDisplayTextиTextобычно соответствующие свойствуAsStringконкретного поля представленного компонентом, напримерTable1Summa.

В данном случае в параметрах обработчика: объект Senderявляется – полем классаTField,Text– является отображаемой строкой текста, аDisplayTextуже имеет булевский тип и определяет будет ли строкаTextиспользоваться для отображения или редактирования.

Задание 3.3. Программно выведем информацию о именах полей БД в Memo1.

Здесь же скиньте на форму Memo1 иButton1.

Для Button1 установите свойствоCaptionв “Имена полей”

При щелчке на Button1 выведем вMemo1 названия всех полей. В обработчике щелчкаButton1 напишите:

var i:integer; s:string;

begin

s:='';

for i:=0 to Table1.FieldCount-1 do

s:=s+' '+Table1.Fields[i].FieldName;

Memo1.Lines.Add(s);

end;

Здесь компонент Table1 имеет свойство Fields представленное как

property Fields[Index: Integer]; Index означает номер поля.

Свойство FieldCount возвращает количество полей в текущей структуре записи. FieldName – в данном случае возвращает имя поля по заданному индексу поля. Первое поле индексируется 0, второе 1 , третье 2 и т.д.

Запустите программу. Щелкните Button1. Программа должна выводить имена полей.Вернитесь в РП.

Задание 3.4. Программно и выведем всю информацию из БД в Memo1.

Скиньте на форму Button2.

Для Button2 установите свойствоCaptionв “Данные в Мемо”

В обработчике щелчка на ней напишите:

var i,j:integer; s:string;

begin

memo1.Clear; // очищаем Мемо

Table1.First; // Переходим на первую запись (строку) вTable1

with Table1 do // Для объекта Table1

fori:=0toRecordCount-1dobegins:=''; //Цикл по количеству записей (то есть строк)

forj:=0toFieldCount-1do//Цикл по количеству полей (то есть столбцов)

s:=s+' '+Fields[j].AsString; // Вывод значения элемента записи в строковом формате

next; // переход на следующую запись от текущей

Memo1.Lines.Add(s);

end;

end;

Запустите программу. Щелкните Button1. Программа должна выводить информацию из БД в Мемо1.Вернитесь в РП.

Здесь RecordCount– является свойствомTable1 и содержит количество записей или строк в таблице.

Для перемещения по таблице имеются следующие методы:

Table1.First- переход на первую запись

Table1.Last- переход на последнюю запись

Table1.Prior-переход на предыдущую запись

Table1.Next - переход на следующую запись

procedure MoveBy(N: Integer);

Процедура MoveBy перемещает указатель в объекте Table1 на N записей вперед или назад в таблице. Нет никакого различия между вызовом метода Table1.Next и вызовом Table1.MoveBy(1).

Аналогично, вызов Table1.Prior имеет тот же результат, что и вызов Table1.MoveBy(-1). Таким образом например: перемещение на 3 записи вперед: MoveBy(3);  перемещение на 3 записи назад: MoveBy(-3).

propertyBOF:BooleanreadFBOF; - возвращаетTrueесли указатель в началеTable1

propertyEOF:BooleanreadFEOF; - возвращаетTrueесли указатель в концеTable1

Также необходимо отметить свойство FieldDefs(класса TFieldDefs) для существующей таблицы содержит информацию обо всех полях таблицы. Число полей определяется свойствомCount, а доступ к элементам массива осуществляется через свойство Items:

 property Items[Index: Integer]: TFieldDef;

Задание 3.4. Разными операторами выведем информацию о двух полях БД в Memo1.

Для доступу к полю мы можем использовать либо его имя и тогда значение записи в данном поле будем получать используя метод требующий в качестве параметра имя поля. Например, оператор Table1.FieldByName('Age').Valueсодержит значение записи поляAge.

У нас в таблице поле Ageявляется вторым по счёту, следовательно, его индекс 1, т.к. нумерация идет от нуля, поэтому оператор совершенно эквивалентный предыдущему будет иметь вид:Table1.Fields[0].Value

Здесь Valueсодержит значение, имеющее конкретный тип – целый, вещественный, текстовый и т.д. В данном случаеValueдля поляAgeимеет целый тип, поэтому можно

Спокойно присвоить некоторой переменной целого типа I:integerданное значение:

I:= Table1.FieldByName('Age').Value или I:= Table1.Fields[0].Value

При этом Delphiтакже легко преобразовывает формат вывода, поэтому если нужно значение целого типа в полеAgeвывести в переменную строкового типаS:stringили вMemo1 нужно проделать следующее:S:=Table1.FieldByName('Age').AsString

Преобразования форматов вывода в классе TFieldследующие:

AsBoolean, AsFloat, AsInteger, AsString, AsDateTime 

Скиньте на форму Button3.

Для Button3 установите свойствоCaptionв “Форматы поля”

В обработчике щелчка на ней напишите:

var s:string; Age:integer;

begin

memo1.Clear;

s:=Table1.Fields[0].AsString;

Memo1.Lines.Add('Значение поля '+

Table1.Fields[0].FieldName+' в формате AsString: '+s);

s:=Table1.FieldByName('Age').AsString;

Memo1.Lines.Add('Значение поля '+

Table1.FieldByName('Age').FieldName+' в формате AsString: '+s);

Age:=Table1.FieldByName('Age').Value;

Memo1.Lines.Add('Значение поля Age в формате Value: '+IntToStr(Age));

end;

Запустите программу. Щелкните Button3. Программа должна работать правильно. Еще раз проанализируйте код.Вернитесь в РП.

Задание 3.5. Программно поменяем значения записей поля Growth(рост) в таблице Table1

Чтобы программно поменять любую текущую запись нужно сначала перевести объект Table1 в режим редактирования методомEdit.

Поменяем просто в цикле значения поля Growth(рост) на 160, 161, 162 и т.д.

Скиньте на форму Button4.

Для Button4 установите свойствоCaptionв “Меняем ПолеGrowthв цикле”

В обработчике щелчка на ней напишите:

var i:integer;

begin

Table1.First;//переход на начало записи (первая строка)

for i:=0 to Table1.RecordCount-1 do begin //Делаем цикл по записям

Table1.Edit;// ПереводимTable1 в режим редактирования

Table1.FieldByName('Growth').value := 160+i; // Меняем записи поля Growth

Table1.Post;// сохраняем данные на диск

Table1.next; // переход на следующую запись

end;

end;

Мы всегда после изменения данных чтобы сохранить их изменёнными в БД должны вызывать метод Table1.Post.

Запустите программу. Щелкните Button4. Программа должна работать правильно. Еще раз проанализируйте код.Вернитесь в РП.

Задание 3.6. Программно вставим ещё одну запись в таблицу Table1

Это можно сделать с помощью метода Insert или Append компонента Table1.

Скиньте на форму Button5.

Для Button5 установите свойствоCaptionв “Insert”

В обработчике щелчка на ней напишите:

Table1.Insert;//переводимTable1 в режим вставки

Table1.FieldByName('Name').AsString := 'STEPAN'; // В поле Name пишем имя STEPAN

Table1.FieldByName('Age').Value := 33; // Указываем возраст 33

Table1.Post; // Сохраняем данные на диск

Запустите программу. Щелкните на Button5, но только один раз иначе возникнет ошибка. Программа должна работать правильно. Еще раз проанализируйте код.Вернитесь в РП.

Также существуют аналогичная процедура Table1.Cancel(Отмена)

Задание 3.7. Программно удалим эту запись в таблице Table1

Скиньте на форму Button6.

Для Button6 установите свойствоCaptionв “Delete”

В обработчике щелчка на ней напишите:

Table1.Delete ; // удалить запись.

Запустите программу. Мышкой в таблице выберите созданную вами запись STEPAN, а затем щелкните только 1 раз наButton6 . Запись должна удалиться. Больше не щелкайте чтобы не удалить остальные записи.Вернитесь в РП.

Задание 3.7. Программно определим, находится ли конкретная запись в таблице Table1 для конкретного поля?

Определим, есть ли сотрудник по фамилии Pahomovaв полеSurname.

Будем использовать function TBDEDataSet.Locate(const KeyFields: string;

const KeyValues: Variant; Options: TLocateOptions): Boolean;

где KeyFields – имя поля, KeyValues – значение поля, Options – опции.

TLocateOption = (loCaseInsensitive, loPartialKey);– класс опций

Скиньте на форму Button7.

Для Button6 установите свойствоCaptionв “Find”

В обработчике щелчка на ней напишите:

if Table1.Locate('Surname','Pahomova',[loCaseInsensitive])

then showmessage('Pahomova найдена!!!') else

showmessage('Pahomova ненайдена')

Здесь Table1.Locate('Surname','Pahomova',[loCaseInsensitive]) возвращает True если Pahomova присутствует в поле Surname, а иначе возвращает False.

Самостоятельное Задание. Программным путем выведите в Memo1 самого толстого и самого старого человека из БД Сотрудники.

В вашей БД «Сотрудники» поле Weight– означает вес.

Самостоятельное Задание. В Delphi с помощью мастера БД откройте учебную БД с псевдонимом DBDEMOS и выберите файл с именем animals.dbf, создайте отображение БД в виде сетки (Gird) Будем отображать рисунки в DBImage1 из данной БД.

Поместите компонент DBImage1 на форму, настройтеDBImage1 на БД используя свойствоDataSource, также настройтеDBImage1 на отображение рисунков животных из данной базы данных используя его свойствоDataField.

Указание студентам:

После того как сделали данную лабораторную работу удалите созданную Вами БД Сотрудники используяDatabaseDesktop.Сначала удалите псевдоним (Алиас).

Запустите DatabaseDesktop. ВыберетеTools–>AliasManager, а затем выберите псевдонимSotrudnikтак как показано на рисунке и затем щёлкните на кнопкеRemoveодин раз чтобы случайно не удалить другие псевдонимы.

Далее сотрите с жесткого диска каталог, где хранились файлы вашей БД. В данном случае D:\Database\Sotrudink

автор и разработчик лабораторных

работ по Delphi

доцент кафедры Информационных технологий и систем

кандидат физ.-мат. наук

Санников Е.В.

Соседние файлы в папке Лабы IT