Лабораторная работа N 7. Изучение компонентов InterBase Express

Постановка задачи

Теоретические предпосылки

Постановка задачи

Цель работы:

Научиться создавать простейшее приложение для работы с базой данных в среде Delphi с использованием InterBase Express.

Задание:

а)

б)

в)

г)

д)

е)оформить и сдать лабораторную работу N 7.

Теоретические предпосылки

На странице InterBase Палитры компонентов содержатся компоненты доступа к данным, адаптированные для работы с сервером InterBase и объединенные названием InterBase Express. Компоненты InterBase Express предназначены для работы с сервером InterBase версии не ниже 5.5. Их преимущество заключается в реализации всех функций за счет прямого обращения к API сервера InterBase. Благодаря этому существенно повышается скорость работы компонентов.

Механизм доступа к даннмы

Для компонентов InterBase Express соединение с сервером осуществляет компонент TIBDatabase.

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

Компонент TIBDatabase

Так как для доступа к базе данных компонентам InterBase Express не требуется BDE, то для создания соединения используется только одно свойство DatabaseName. В нем необходимо указать полный путь к выбранному файлу БД.

Создайте новый проект (желательно в среде Borland Delphi 7), найдите в Палитре компонентов InterBase компонент IBDatabase и разместите его на модуле данных (рисунок 1).

Рисунок 1

Рассмотрим основные свойства компонента TIBDatabase, обеспечивающие соединение с базой данных. Для этого вызовите собственный редактор компонента, нажав правой кнопкой мыши на значке комопнента (рисунок 2).

Рисунок 1

Connection

Во-первых, выбирается требуемый сервер: локальный (Local) или удаленный (Remote). Затем используемый сетевой протокол. При помощи кнопки Browse выбирается файл базы данных.

На панели Database Parameters задаются имя пользователя, его пароль и роль.

В приложении с BDE взаимодействует компонент доступа к данным, который представляет собой "образ" таблицы базы данных в приложении.

С каждым компонентом доступа к данным должен быть связан как минимум один компонент TDataSource. В его обязанности входит соединение набора данных с компонентами отображения данных. Он обеспечивает передачу в эти компоненты текущих значений полей из набора данных и возврат в него сделанных изменений. Еще одна функция компонента TDataSource заключается в синхронизации поведения компонентов отображения данных с состоянием набора данных.

С одним компонентом TDataSource могут быть связаны несколько визуальных объектов отображения данных. При открытии набора данных BDE обеспечивает передачу в набор данных записей из требуемой таблицы БД. Курсор набора данных устанавливается на первую запись. При перемещении по записям текущие значения полей в компонентах отображения данных автоматически обновляются.

Пользователь при помощи компонентов отображения данных может просматривать и редактировать данные. Измененные значения сразу же передаются из элемента управления в набор данных при помощи компонента TDataSource.

Рассмотрим этапы создания простейшего приложения баз данных.

Этап 1. Подключение набора данных

Компонент доступа к данным является основой приложения баз данных. В процессе работы такой компонент тесно взаимодействует с BDE. Отметим, что все компоненты доступа к данным являются невизуальными.

Для дальнейшей работы создайте новый проект в среде Delphi.

Для размещения компонентов доступа к данным в приложении баз данных можно использовать как основную форму, так и специальную форму - модуль данных. В данном модуле можно размещать только невизуальные компоненты. В отличие от основной формы пользователь не увидит модуль данных во время выполнения программы. Для создания модуля данных можно воспользоваться репозиторием объектов: File - New - Data Module.

На рисунке 5 представлено окно формы Data Module с расположенным на ней компонентами TDataSource и TTable.

Рисунок 5

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

Сделать это можно либо непосредственно внеся строчку

uses DataModule2;

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

Либо воспользовавшись командой File - Use Unit.

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

В качестве примера попробуем создать простейшее приложение баз данных, работающее с базой данных tel.gdb, которая объявлена под псевдонимом Telephone в BDE.

Замечание: прежде чем работать с приложением баз данных запустите InterBase-сервер.

Разместите на модуле данных нового проекта два компонента из страницы Data Access - TDataSource и TTable.

Установим вначале свойства компонентов с помощью Инспектора объектов.

Активизируйте объект Table на модуле данных и проставьте следующие значения его свойств (рисунок 6):

DataBaseName - Telephone

TableName - Lichnost

Active - True

Рисунок 6

С помощью свойства Name можно переименовать компонент Table1. Не смотря на то, что делать это необязательно, задание смысловых имен облегчает чтение исходного кода программы.

Связь компонента с таблицей данных активизируется после установления свойства Active в значение True. Однако открытие и закрытие набора данных лучше предусмотреть. Чаще всего набор данных должен открывать при первом показе формы и закрываться при ее закрытии.

На событие onCreate в Form1 необходимо разместить такой обработчик (альтернатива непосредственному установлению свойства Active в значение True):

procedure TForm1.FormCreate(Sender: TObject);

begin

try

DataModule2.Table1.Open;

except

ShowMessage('Ошибка открытия таблицы');

end;

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

При создании формы выполняется метод-обработчик FormСreate. В нем набор данных открывается при помощи метода Open. Конструкция try : except обеспечивает корректное завершение при возникновении исключительных ситуаций (потеря или искажение данных).

Этап 2. Настройка компонента TDataSourсe

Как уже говорилось, компонент TDataSourсe обеспечивает взаимодействие набора данных с компонентами отображения данных. Одному компоненту набора данных соответствует обычно один TDataSourсe, но в принципе их может быть больше.

Для настройки свойств компонента необходимо следующее: во-первых, связать набор данных и TDataSourсe. Для этого используется свойство DataSet, доступное через Инспектор объектов; во-вторых, переименовать компонент (необязательно) (рисунок 7).

Рисунок 7

Этап 3. Отображение данных

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

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

Разместите TDBGrid на Form1 (рисунок 8).

Рисунок 8

Настроим свойства этого компонента.

1. Связать TDBGrid с компонентом TDataSource. Для этого используется свойство DataSource компонента TDBGrid, из списка выберите необходимый TDataSource.

2. По умолчанию будут выводиться все поля таблицы данных. Для задания списка необходимых полей, воспользуйтесь свойством Columns (в инспекторе объектов). После того, как вы вызовете это свойство, появится окно редактора столбцов (рисунок 9).

Рисунок 9

Щелкните правой кнопкой мыши на поверхности окна Columns и выберите пункт Add All Fields, после чего все поля набора данных будут включены для отображения. Если некоторые поля Вы не хотите выводить в TDBGrid, удалите их, выделив и нажав клавишу Delete.

Каждое выводимое поле в TDBGrid можно настроить отдельно. Для этого откройте редактор столбцов, выделите необходимое поле и с помощью Инспектора Объектов настройте соответствующие свойства (заголовок, выравнивание, цвет и т.д.), например, как это показано на рисунке 10.

Рисунок 10

Обратите особое внимание на свойство ReadOnly, если значение этого свойства равно True, то данные доступны только для чтения.

Еще одним удобным средством для работы с базой данных является TDBNavigator, который служит для навигации по таблице данных (переход между записями, добавление, удаление, обновление и т.д.) (рисунок 11). Для связи данного компонента с набором данных, также используется TDataSource, для этого установите соответствующее значение в свойство DataSource компонента TDBNavigator.

Рисунок 11

Организация запросов к БД. Компонент TQuery

Главную роль в подготовке и диспетчеризации запросов SQL играет BDE. Непосредственную обработку запросов выполняет СУБД, точнее компонент СУБД - менеджер запросов.

Инициатором запросов выступает приложение. Для создания и выполнения запросов предназначен компонент TQuery, который содержит текст запроса, умеет выполнять его и инкапсулирует набор данных с результатом выполнения запроса. Этот набор данных можно использовать как и любой другой набор, например, созданный при помощи TTable.

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

Рассмотрим простой пример организации запроса к базе данных с помощью компонента TQuery, который располагается на странице Data Access. Расположите компонент TQuery на модуле данных (рисунок 12).

Рисунок 12

Установите свойства TQuery с помощью инспектора объектов.

DatabaseName - псевдоним базы данных, настроенный в BDE.

С помощью свойства SQL вызовите окно редактора запросов и введите содержание запроса (рисунок 13).

Рисунок 13

Для активизации TQuery установите свойство Active равным значению True. Если предстоит работать с большим запросом, то его проще предварительно отладить (например, с помощью программы SQL Explorer), а затем скопировать в редактор запросов.

Для того, чтобы связать TQuery с компонентами отображения данных, расположим на модуле данных TDataSource2, у которого в свойстве DataSet укажем Query1.

Для вывода данных на форму опять воспользуемся TDBGrid. Расположите компонент TDBGrid (страница Data Controls) на форме и установите в свойстве Datasource значение DataSource2 (рисунок 14).

Рисунок 14

Еще один компонент, который необходимо изучить в данной работе - TDataBase (размещен на странице Data Access). Как вы заметили, для любого компонента доступа к данным необходимо устанавливать свойство DatabaseName, для указания той базы данных, с которой будет происходить работа. В случае, если псевдоним базы данных поменяется, то придется изменять значение данного свойства на новое. В случае небольшого приложения сделать это можно достаточно быстро, но если ваше приложение содержит достаточно много компонентов доступа к данным, возникает ряд затруднений. Чтобы избежать этой проблемы среда Delphi содержит специальный компонент TDataBase, который предназначен для настройки параметров подключения базы данных из приложения.

Разместите компонент TDataBase на модуле данных (рисунок 15).

Рисунок 15

Для установки параметров щелкните правой кнопки мыши на ярлыке компонента TDataBase и выберите пункт Database Editor, после чего появится окно установки параметров TDataBase (рисунок 16).

Рисунок 16

Среди списка параметров выберем и установим основные:

SERVER NAME - укажите путь к базе данных

USER NAME - укажите имя пользователя, который создавал БД

PASSWORD - пароль для подключения к БД

Если вы задали пароль явно в списке параметров, то опцию Login prompt можно деактивизировать, чтобы система при каждом открытии набора данных с помощью TDataBase не запрашивала ввода пароля.

После установки параметров нажмите кнопку ОК. Для подключения к БД активизируйте свойство Connecting компонента TDataBase.

После этого замените значение свойства DatabaseName у компонента TQuery на tel.

В случае многопользовательского доступа к ресурсам БД указывать по умолчанию имя и пароль пользователя не имеет смысла и может привести к потере или искажению информации в случае несанкционированного доступа. Поэтому параметры TDatabase устанавливаются программно, после того, как пользователь ввел свои идентификаторы.

Например, на событие создания формы расположим следующие процедуру и функцию:

function Error(e:EDBEngineError):string;

var

i,j:integer;

s:string;

begin

Result:='';

i:=0;

while (E.Errors[i].NativeError=0) and (i<>e.ErrorCount) do inc(i);

if i<>e.ErrorCount then if E.Errors[i].ErrorCode=13059 then

begin

j:=i;

s:='';

while E.Errors[j].ErrorCode=13059 do

begin

s:=s+E.Errors[j].Message;

inc(j);

end;

if (E.Errors[i].NativeError=-904) and (copy(s,1,6)='unavai')

then Result:='Не запущен сервер базы данных.'#13#10'Подключение невозможно.';

if (E.Errors[i].NativeError=-902) and (copy(s,1,6)='Your u')

then Result:='Ваше имя и пароль не определены. Проверьте правильность ввода.'#13#10'В случае неудачи обращайтесь к системному администратору.';

if (E.Errors[i].NativeError=-902) and (copy(s,1,6)='I/O er')

then Result:='Системе не удается найти базу данных.'#13#10'(Неправильно указан путь или имя базы данных).';

if (E.Errors[i].NativeError=-902) and (copy(s,1,6)='Unable')

then Result:='Не найден сетевой путь.'#13#10'(Неправильно указан сервер базы данных).';

if result='' then result:=s;

end

else for i:=0 to E.ErrorCount-1 do Result:=result+E.Errors[i].Message;

end;

procedure Connect_Disconnect;

const iPath='c:/bd/sotr.gdb';

var i: integer;

flagError : boolean;

begin

if DataModule2.Database1.Connected

then

DataModule2.Database1.Close

else

begin

with DataModule2.Database1.Params do begin

{Задаем параметры подключения к базе данных}

Clear;

Add('SERVER NAME='+ iPath);

Add('OPEN MODE=READ/WRITE');

Add('SCHEMA CACHE SIZE=8');

Add('LANGDRIVER=ancyrr');

Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');

Add('SCHEMA CACHE TIME=-1');

Add('SCHEMA CACHE TIME=-1');

Add('MAX ROWS=-1');

Add('BATCH COUNT=200');

Add('ENABLE SCHEMA CACHE=FALSE');

Add('ENABLE BCD=TRUE');

Add('USER NAME=SYSDBA');

Add('BLOBS TO CACHE=64');

Add('BLOB SIZE=32');

end;

try

flagError:=false;

DataModule2.Database1.Open;

except

{Произошла ошибка}

on E:EDBEngineError do

begin

flagError:=true;

MessageDlg(Error(e),mtError,[mbOk],0);

end

else raise;

end;

if not flagError then DataModule2.Table1.Open;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Connect_Disconnect;

end;

Установите активным свойство Login Prompt у компонента Database, тогда при открытии приложения система запросит ввод пароля. Строчку Add('USER NAME=SYSDBA'); можно было не указывать, в этом случае системы выдавала бы по умолчанию имя пользователя - MYNAME.