Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009

.pdf
Скачиваний:
5339
Добавлен:
14.05.2016
Размер:
14.64 Mб
Скачать
O n C h a n g e .

/ I. Borland С++ Builder

4 1 3

M e s s a g e

типа S t r i n g (текст сообщения, характеризующего возникшую

 

ошибку);

 

 

E r r o r C o d e типа D B I R e s u l t (код ошибки), тип D B I R e s u l t соответствует

 

типу W o r d ;

 

C a t e g o r y

типа B y t e

(категория исключения);

S u b C o d e

типа B y t e

(группа, или подкод, исключения);

N a t i v e E r r o r типа L o n g i n t (код ошибки, возвращаемой сервером) — если

 

значение этого свойства равно нулю, то исключение произошло не на

 

сервере.

 

 

Класс E D B C I i e n t отличается от класса E D B E n g i n e E r r o r в основном тем, что предназначен для обработки ошибок, возникающих при работе с различными механизмами доступа к данным (не только с процессором баз данных BDE) в операциях с сетевыми базами архитектуры «клиент-сервер».

Генерируемые при работе с БД исключения обрабатывают глобальные и локальные обработчики. Кроме того, используемые для доступа к данным компоненты имеют специальные события для обработки исключений.

Например, для набора данных T a b l e такими событиями являются:

O n E d i t E r r o r

(ошибка редактирования или вставки записи);

O n P o s t E r r o r

и O n U p d a t e E r r o r (ошибка закрепления изменений в записи);

OnDeleteError (ошибка удаления записи).

Класс E D B E d i t E r r o r используется в случаях, когда вводимые в поле данные несовместимы с маской ввода, заданной с помощью свойства EditMask этого поля. Отметим, что для проверки вводимых в поле значений можно также использовать события O n S e t T e x t , O n V a l i d a t e и

11.7. Создание таблиц базы данных

Работа по созданию информационной системы включает два основных этапа: создание БД и создание приложения. Продемонстрируем возможности С++ Builder по работе с БД на примере создания простой информационной системы. Эту информационную систему можно разработать даже без написания кода: все необходимые операции выполняются с помощью программы Database Desktop, Конструктора формы и Инспектора объектов.

В простейшем случае БД состоит из одной таблицы. Если таблицы уже имеются, то первый этап не выполняется. Отметим, что совместно с С++ Builder поставляется большое количество примеров приложений, в том числе и приложений БД. Файлы таблиц для этих приложений находятся в каталоге c:\Program Files\Common Files\Borland Shared\Data. Готовые таблицы также можно использовать для своих приложений.

Для работы с таблицами БД при проектировании приложения удобно использовать программу Database Desktop, которая позволяет:

414

Часть 3. Современные СУБД и их применение

создавать таблицы;

изменять структуры;

редактировать записи.

Кроме того, с помощью Database Desktop можно выполнять и другие действия над БД (создание, редактирование и выполнение визуальных и SQLзапросов, операции с псевдонимами). Отметим, что большинство рассматриваемых действий по управлению структурой таблицы можно выполнить также

программно.

 

Процесс создания новой таблицы

начинается с вызова команды

F i l e \ N e w \ T a b l e ( Ф а й л \ Н о в а я \ Т а б л и ц а )

и происходит в интерактивном ре-

жиме. При этом разработчик должен:

 

выбрать формат (тип) таблицы;

 

задать структуру таблицы.

 

В начале создания новой таблицы в окне Create Table ( С о з д а н и е т а б л и ц ы ) выбирается ее формат. По умолчанию предлагается формат таблицы Paradox версии 7, который мы и будем использовать. Для таблиц других форматов, например dBase IV, действия по созданию таблицы практически не отличаются.

После выбора формата таблицы появляется окно определения структуры таблицы (рис. 11.19), в котором выполняются следующие действия:

Restructure Paradox 7 Table: aaaaa.db

 

 

 

Field roster:

 

Table properties:

 

Field Name

Type Size Key]

Secondary Indexes

 

Code

+

;""'j|^ine.r'"'i|

Modify.... |

Number

S

 

 

3 j Fio

A

ind 1

 

A\ Address

A

 

 

Г" Pack Table

Save

Save As...

Cancel

Help

Рис. 11.19. Определение структуры таблицы

/ I. Borland С++ Builder

4 1 5

описание нолей;

задание ключа;

задание индексов;

определение ограничений на значения полей;

определение условий (ограничений) ссылочной целостности;

задание паролей;

задание языкового драйвера;

задание таблицы для выбора значений.

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

После определения структуры таблицы ее необходимо сохранить, нажав кнопку S a v e A s и указав расположение таблицы на диске и ее имя. В результате па диск записывается новая таблица, первоначально пустая, при этом все необходимые файлы создаются автоматически.

Описание полей

Центральной частью окна определения структуры таблицы является список Field r o s t e r ( С п и с о к п о л е й ) , в котором указываются поля таблицы. Для каждого поля задаются:

• имя поля — в столбце Field N a m e ;

тип поля — в столбце Туре;

размер поля — в столбце Size .

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

Тип поля можно задать, непосредственно указав соответствующий символ, например, А для символьного или I для целочисленного поля, или выбрать его в списке, раскрываемом нажатием клавиши <пробел> или щелчком правой кнопки мыши в столбце Туре. Список содержит все типы полей, допустимые для заданного формата таблицы. В списке подчеркнуты символы, используемые для обозначения соответствующего типа, при выборе типа эти символы автоматически заносятся в столбец Туре.

Размер ноля задается не всегда, необходимость его указания зависит от типа поля. Для полей определенного типа, например, автоинкрементного (+) или целочисленного (I), размер поля не задается. Для поля строкового типа размер определяет максимальное число символов, которые могут храниться в поле.

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

I n d e x e s

4 1 6 Часть 3. Современные СУБД и их применение

описанными полями выполняется нажатием клавиши <Insert>. Новая строка вставляется перед строкой, в которой расположен курсор. Для удаления строки необходимо установить курсор на эту строку и нажать комбинацию клавиш <Ctrl>+<Delete>.

Ключ создается указанием его полей. Для указания ключевых полей в столбце ключа (Key) нужно установить символ *, переведя в эту позицию курсор и нажав любую алфавитно-цифровую клавишу. При повторном нажатии клавиши отметка принадлежности поля ключу снимается. В структуре таблицы ключевые поля должны быть первыми, т. е. верхними в списке полей. Часто для ключа используют автоинкрементное поле (см. рис. 11.19).

Напомним, что для таблиц Paradox ключ также называют первичным индексом (Primary Index), а для таблиц dBase ключ не создается, и его роль выполняет один из индексов.

Для выполнения остальных действий по определению структуры таблицы используется комбинированный список T a b l e p r o p e r t i e s ( С в о й с т в а т а б - л и ц ы ) , содержащий следующие пункты:

V a l i d i t y C h e c k s (проверка правильности ввода значений полей) — вы-

 

бирается по умолчанию;

Table Lookup (таблица выбора);

S e c o n d a r y

I n d e x e s

(вторичные индексы);

R e f e r e n t i a l

I n t e g r i t y

(ссылочная целостность);

Password Security

( п а р о л и ) ;

T a b l e L a n g u a g e (язык таблицы, языковой драйвер);

D e p e n d e n t

T a b l e s (подчиненные таблицы).

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

Состав данного списка зависит от формата таблицы. Так, для таблицы dBase он содержит только пункты и T a b l e L a n g u a g e .

Задание индексов

Задание индекса сводится к определению:

состава полей;

параметров;

имени.

Эти элементы устанавливаются или изменяются при выполнении операций создания, изменения и удаления индекса. Напомним, что для таблиц Paradox индекс называют также вторичным индексом.

Для выполнения операций, связанных с заданием индексов, необходимо выбрать пункт S e c o n d a r y I n d e x e s ( В т о р и ч н ы е и н д е к с ы ) списка T a b l e

p r o p e r t i e s ( С в о й с т в а

т а б л и ц ы ) , при этом под списком появляются кнопки

D e f i n e ( О п р е д е л и т ь )

и M o d i f y ( И з м е н и т ь ) , список индексов и кнопка E r a s e

/ I. Borland С++ Builder

417

( У д а л и т ь ) . В списке индексов выводятся имена созданных индексов, на

р и с . 11.19 э т о и н д е к с ind_1.

Создание нового индекса начинается с нажатия кнопки Define, которая всегда доступна. Она открывает окно D e f i n e S e c o n d a r y Index ( З а д а н и е в т о - р и ч н о г о и н д е к с а ) , в котором задаются состав полей и параметры индекса (рис. 11.20).

В списке Fields окна выводятся имена всех полей таблицы, включая и те, которые недопустимы в составе индекса, например, графическое поле или поле комментария. В списке I n d e x e d fields ( И н д е к с н ы е п о л я ) содержатся поля, которые включаются в состав создаваемого индекса. Перемещение полей между списками выполняется выделением нужного поля (полей) и нажатием расположенных между этими списками кнопок с изображением горизонтальных стрелок. Имена полей, которые нельзя включать в состав индекса, выделяются в левом списке серым цветом. Поле не может быть повторно включено в состав индекса, если оно уже выбрано и находится в правом списке.

Замечание.

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

Define Secondary Index

Ш

 

ields:

Indexed fields:

Code

 

Number

 

F'io

 

. • • I

 

 

 

Change order:

 

• Index options —

 

 

 

Г

Unique

Г

Case sensitive

 

F?

Maintained

Г"

Descending

 

 

OK

 

Cancel

Help

Рис. 11.20. Окно задания индекса

14 Зак. 541

4 1 8 Часть 3. Современные СУБД и их применение

Изменить порядок следования полей в индексе можно с помощью кнопок с изображением вертикальных стрелок, имеющих общее название C h a n g e o r d e r ( И з м е н и т ь п о р я д о к ) . Д л я п е р е м е щ е н и я п о л я ( п о л е й ) необходимо его (их) выделить и нажать нужную кнопку.

Флажки, расположенные в нижней части окна задания индекса, позволяют указать следующие параметры индекса:

U n i q u e — индекс требует для составляющих его полей уникальных зна-

 

чений;

— задается автоматическое обслуживание индекса;

M a i n t a i n e d

C a s e s e n s i t i v e — для полей строкового типа учитывается регистр сим-

 

волов;

 

D e s c e n d i n g

— сортировка выполняется в порядке убывания значений.

Так как у таблиц dBase нет ключей, для них использование параметра Unique является единственной возможностью обеспечить уникальность записей на физическом уровне (уровне организации таблицы), не прибегая к программированию.

После задания состава индексных полей и нажатия кнопки ОК появляе тся окно S a v e I n d e x As, в котором нужно указать имя индекса. Для удобства обращения к индексу в его имя можно включить имена полей, указав какой-нибудь префикс, например ind. Нежелательно образовывать имя индекса только из имен полей, т. к. для таблиц Paradox подобная система именования используется при автоматическом образовании имен для обозначения ссылочной целостности между таблицами. После повторного нажатия кнопки ОК сформированный индекс добавляется к таблице, и его имя появляется в списке индексов.

Созданный индекс можно изменить, определив новый состав полей, параметров и имени индекса. Изменение индекса практически не отличается от его создания. После выделения индекса в списке и нажатия кнопки M o d i f y снова открывается окно задания индекса (см. рис. 11.20). При нажатии кнопки ОК появляется окно сохранения индекса, содержащее имя изменяемого индекса, которое можно исправить или оставить прежним.

Для удаления индекса его нужно выделить в списке индексов и нажать кнопку Erase . В результате индекс удаляется без предупреждающих сообщений.

Кнопки M o d i f y и E r a s e доступны, только если индекс выбран в списке.

Задание ограничений на значения полей

Задание ограничений на значения полей заключается в указании для полей:

требования обязательного ввода значения;

минимального значения;

максимального значения;

значения по умолчанию;

маски ввода.

/ I. Borland С++ Builder

4 1 9

Установленные ограничения задаются на физическом уровне (уровне таблицы) и действуют для любых программ, выполняющих операции с таблицей: как для программ типа Database Desktop, так и для приложений, создаваемых в С++ Builder. Дополнительно к этим ограничениям или вместо них в приложении можно задать программные ограничения.

Для выполнения операций, связанных с заданием ограничений на значения полей, нужно выбрать пункт V a l i d i t y C h e c k s ( П р о в е р к а з н а ч е н и й ) ком-

бинированного списка T a b l e

p r o p e r t i e s

(см. рис. 11.19).

Задание

ссылочной

целостности

Понятие ссылочной целостности относится к связанным таблицам и проявляется в следующих вариантах взаимодействия таблиц:

запрещается изменять поле связи или удалять запись главной таблицы, если для нее имеются записи в подчиненной таблице;

при удалении записи в главной таблице автоматически удаляются соответствующие ей записи в подчиненной таблице (каскадное удаление).

Для выполнения операций, связанных с заданием ссылочной целостности, необходимо выбрать пункт R e f e r e n t i a l I n t e g r i t y комбинированного списка T a b l e p r o p e r t i e s (см. рис. 11.19).

Задание паролей

Пароль позволяет задать права доступа пользователей (приложений) к таблице. Если для таблицы установлен пароль, то он будет автоматически запрашиваться при каждой попытке открытия таблицы.

Пароль действует на физическом уровне и его действие распространяется на все программы, выполняющие доступ к таблице: как на программы типа Database Desktop, так и на создаваемые приложения С++ Builder.

Для выполнения операций, связанных с заданием пароля, нужно выбрать строку P a s s w o r d S e c u r i t y в комбинированном списке T a b l e p r o p e r t i e s окна определения структуры таблицы (см. рис. 11.19).

Задание языкового драйвера

Для задания языкового драйвера нужно выбрать пункт T a b l e L a n g u a g e (Язык таблицы) комбинированного списка T a b l e p r o p e r t i e s окна определения структуры таблицы (см. рис. 11.19).

Изменение структуры таблицы

Структуру существующей таблицы можно изменить, выполнив команду T a b l e \ R e s t r u c t u r e после предварительного выбора таблицы в окне программы Database Desktop. В результате открывается окно определения структуры таблицы, и дальнейшие действия не отличаются от действий, выполняемых при создании таблицы.

D a t a B a s e N a m e

4 2 0

Часть 3. Современные СУБД и их применение

При изменении структуры таблицы с ней не должны работать другие приложения, в том числе С++ Builder. Поэтому предварительно необходимо закрыть С++ Builder или приложение, в котором компоненты T a b l e связаны с перестраиваемой таблицей. Другим вариантом является отключение активности компонентов T a b l e , связанных с перестраиваемой таблицей, для чего свойству A c t i v e этих компонентов через Инспектор объектов устанавливает-

ся значение false.

Переименование таблицы следует выполнять из среды программы Database Desktop, а не из среды Windows, например, с помощью Проводника. Для этого при работе со структурой таблицы можно нажать кнопку S a v e a s и задать новое имя таблицы. В результате в указанном каталоге диска появятся все необходимые файлы таблицы. При этом старая таблица также сохраняется. Информация о названии таблицы используется внутри ее файлов, поэтому простое переименование всех файлов таблицы приведет к ошибке при попытке доступа к ней.

Если необходимо просто ознакомиться со структурой таблицы, то выполняется команда T a b l e \ l n f o S t r u c t u r e . В результате появляется окно определения структуры таблицы, но элементы, с помощью которых в структуру таблицы могут быть внесены изменения, заблокированы. Просмотр структуры возможен также для таблицы, с которой связаны другие приложения.

11.8. Создание приложения BDE

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

Вид формы приложения на этапе проектирования показан на рис. 11.21, где в форме размещены компоненты T a b l e l , D a t a S o u r c e l , D B G r i d l и

D B N a v i g a t o r l .

Компонент T a b l e 1 обеспечивает взаимодействие с таблицей БД. Для связи с требуемой таблицей нужно установить в соответствующие значения свойство D a t a B a s e N a m e , указывающее путь к БД, и свойство T a b l e N a m e , указывающее имя таблицы. После задания таблицы для открытия набора данных свойству A c t i v e должно быть установлено значение t r u e .

Свойству A c t i v e нужно устанавливать значение true после задания таблицы БД, т. е. после установки нужных значений свойств и

T a b l e N a m e .

/ I. Borland С++

Builder

 

 

 

 

 

 

421

I (\П, Form2

 

 

 

 

 

 

 

NAME

 

SIZE

 

WEIGHT

шщ

 

Is**

[Angel Fish

|

2

1

2'

==

 

• Ш

r "

i ' 1

" I

м

A

j

j 4Ч | с j

 

 

 

 

 

 

 

Рис. 11.21. Форма приложения для работы с БД

Имя таблицы лучше выбирать в раскрывающемся списке в поле значения свойства T a b l e N a m e . Если путь к БД (свойство D a t a B a s e N a m e ) задан правильно, то в этом списке отображаются главные файлы всех доступных таблиц.

В рассматриваемом приложении использована таблица животных, входящая в состав поставляемых с С++ Builder примеров, ее главный файл — Animals.dbf. Файлы этой и других таблиц примеров находятся в каталоге, путь к которому указывает псевдоним dbdemos. Настройка псевдонима может быть выполнена с помощью программы BDE Administrator.

Компонент D a t a S o u r c e l является промежуточным звеном между компонентом T a b l e 1, соединенным с реальной таблицей БД, и визуальными ком-

понентами D B G r i d l

и D B N a v i g a t o r l , с помощью которых пользователь взаи-

модействует с этой

таблицей. На компонент T a b l e 1, с которым связан

компонент D a t a S o u r c e l , указывает свойство D a t a S e t последнего.

Компонент D B G r i d l отображает содержимое таблицы БД в виде сетки, в которой столбцы соответствуют полям, а строки — записям таблицы. По умолчанию пользователь может просматривать и редактировать данные. Компонент D B N a v i g a t o r l позволяет пользователю перемещаться по таблице, редактировать, вставлять и удалять записи. Компоненты D B G r i d l и D B N a v i g a t o r l связываются со своим источником данных — компонентом D a t a S o u r c e l — через свойства D a t a S o u r c e .

Взаимосвязь компонентов приложения и таблицы БД и используемые при этом свойства компонентов показаны на рис. 11.22.

Форма приложения

Рис. 11.22. Взаимосвязь компонентов приложения и таблицы БД

422

Часть 3. Современные СУБД и их применение

Разрабатывая приложение, можно задавать значения всех свойств компонентов с помощью Инспектора объектов. При этом требуемые значения либо непосредственно вводятся в поле, либо выбираются в раскрывающихся списках. В последнем случае приложение создается с помощью мыши и не требует набора каких-либо символов на клавиатуре. В табл. 11.2 приведены компоненты, используемые для работы с таблицей БД, их основные свойства и значения этих свойств.

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

 

Значения свойств компонентов

Таблица 11.2.

 

 

Компонент

Свойства

Значения

Table 1

DataBaseName

dbdemos

 

TableName

Animals.dbf

 

Active

true

DataSourcel

DataSet

Table 1

DBGridl

DataSource

DataSourcel

DBNavigatorl

. DataSource

DataSourcel

Для автоматизации процесса создания формы, использующей компоненты для операций с БД, можно вызвать D a t a b a s e F o r m W i z a r d ( М а с т е р ф о р м б а з д а н н ы х ) . Этот Мастер расположен на странице B u s i n e s s Хранилища объектов.

Мастер позволяет создавать формы для работы с отдельной таблицей и со связанными таблицами, при этом можно использовать наборы данных Table

и л и Query .

11.9. Работа с отчетами

Отчет представляет собой печатный документ, в котором содержит такие же данные, как получаемые в результате выполнения запроса к БД. Можно выделить следующие виды отчетов: простой; с группированием данных; для таблиц, связанных отношением «главный-подчиненный»; составной, объединяющий несколько разных отчетов. В С++ Builder для создания отчетов служит генератор отчетов QuickReport, содержащий большой набор компонентов. Мы рассмотрим средства создания отчета и приведем пример создания простого отчета.