|
.: Учебник по Delphi 7 для начинающих :.
Глава
17
Базы
данных
С точки зрения
пользователя, база данных — это программа, которая обеспечивает работу
с информацией. При запуске такой программы на экране, как правило, появляется
таблица, просматривая которую пользователь может найти интересующие его сведения.
Если система позволяет, то он может внести изменения в базу данных: добавить
новую информацию или удалить ненужную.
С точки зрения
программиста, база данных — это набор файлов, содержащих информацию.
Разрабатывая базу данных для пользователя, программист создает программу, которая
обеспечивает работу с файлами данных.
В настоящее
время существует достаточно большое количество программных систем, позволяющих
создавать и использовать локальные (dBASE, FoxPro, Access, Paradox) и удаленные
(Interbase, Oracle, Sysbase, Infomix, Microsoft SQL Server) базы данных.
В состав
Delphi входят компоненты, позволяющие создавать программы работы с файлами данных,
созданными различными системами: от dBASE до Infomix и Oracle. Delphi также
позволяет программисту, используя утилиту Borland Database Desktop, создавать
файлы баз данных в различных форматах.
В зависимости
от расположения программы, использующей данные, и самих данных, а также способа
разделения данных между несколькими пользователями различают локальные и
удаленные базы данных.
Данные локальной
базы данных (файлы данных) находятся на одном (локальном) устройстве, в качестве
которого может выступать диск компьютера или сетевой диск (диск другого компьютера,
работающего в сети).
Для обеспечения
разделения данных (доступа к данным) между несколькими пользователями, в качестве
которых выступают программы, работающие на одном или нескольких компьютерах,
в локальных базах данных применяется метод, получивший название блокировка
файлов. Суть этого метода заключается в том, что пока данные используются
одним пользователем, другой пользователь не может работать с этими данными,
т. е. данные для него закрыты, заблокированы.
Paradox,
dBase, FoxPro и Access — это локальные базы данных.
Данные (файлы)
удаленной базы данных находятся на удаленном компьютере. (Следует обратить внимание,
что каталоги удаленного компьютера не могут рассматриваться как сетевые диски.)
Программа
работы с удаленной базой данных состоит из двух частей: клиентской и серверной.
Клиентская часть программы, работающая на компьютере пользователя, обеспечивает
взаимодействие с серверной программой: посредством запросов, передаваемых на
удаленный компьютер, предоставляет доступ к данным.
Серверная
часть программы, работающая на удаленном компьютере, принимает запросы,
выполняет их и пересылает данные клиентской программе. Запросы представляют
собой команды, представленные на языке SQL (Structured Query Language) — языке
структурированных запросов.
Программа,
работающая на удаленном сервере, проектируется таким образом, чтобы обеспечить
одновременный доступ к информации нескольким пользователям. При этом для обеспечения
доступа к данным вместо механизма блокировки файлов используют механизм транзакций.
Транзакция
— это некоторая последовательность действий, которая должна быть обязательно
выполнена над данными перед тем, как они будут переданы. В случае обнаружения
ошибки во время выполнения любого из действий вся последовательность действий,
составляющая транзакцию, повторяется снова. Таким образом, механизм транзакций
обеспечивает защиту от аппаратных сбоев. Он также обеспечивает возможность многопользовательского
доступа к данным.
Разработка
программы работы с удаленной базы данных — сложная и трудоемкая задача. Ее решение
предполагает наличие у разработчика глубоких знаний и большого опыта разработки
программного обеспечения. Поэтому
в данной книге задача разработки удаленных баз данных не рассматривается.
База данных
— это набор однородной, как правило, упорядоченной по некоторому критерию, информации.
База данных может быть представлена в "бумажном" или в компьютерном
виде.
Типичным
примером "бумажной" базы данных является каталог библиотеки — набор
бумажных карточек, содержащих информацию о книгах. Информация в этой базе однородная
(содержит сведения только о книгах) и упорядоченная (карточки расставлены, например,
в соответствии с алфавитным порядком фамилий авторов). Другими примерами "бумажной"
базы данных являются телефонный справочник и расписание движения поездов.
Компьютерная
база данных представляет собой файл (или набор связанных файлов), содержащий
информацию.
База данных
состоит из записей. Каждая запись содержит информацию об одном экземпляре.
Например, каждая запись базы данных "Архитектурные памятники Санкт-Петербурга"
содержит информацию только об одном экземпляре — историческом памятнике.
Записи состоят
из полей. Каждое поле содержит информацию об одной характеристике экземпляра.
Например, запись базы данных "Архитектурные памятники Санкт-Петербурга"
состоит из следующих полей: "Памятник", "Архитектор" и "Историческая
справка", где "Памятник", "Архитектор" и "Историческая
справка" — это имена полей. Содержимое этих полей характеризует конкретный
памятник.
Следует обратить
внимание, что каждая запись состоит из одинаковых полей. Некоторые поля могут
быть не заполнены, однако они все равно присутствуют в записи.
На бумаге
базу данных удобно представить в виде таблицы (рис. 17.1). Каждая строка таблицы
соответствует записи, а ячейка таблицы — полю. При этом заголовок столбца таблицы
— это имя поля, а номер строки таблицы — номер записи.
Информацию
компьютерных баз данных обычно выводят на экран в виде таблиц. Поэтому в литературе
довольно часто вместо словосочетания "файл данных" используется словосочетание
"таблица данных" или просто "таблица".
Рис. 17.1. Представление
БД в виде таблицы
Каждая таблица
физически хранится в отдельном файле. Однако отождествлять базу данных и таблицу
нельзя, так как довольно часто поля одной записи распределены по нескольким
таблицам и, следовательно, находятся в разных файлах.
В простейшем
случае источником информации для программы, работающей с базой данных, может
быть вся таблица. Однако, как правило, пользователя интересует не вся информация,
находящаяся в базе данных, а только какая-то ее часть. Он выбирает и просматривает
только некоторые, удовлетворяющие его запросу записи. Поэтому в модель базы
данных помимо таблицы, представляющей собой всю базу данных, было введено понятие
запроса, являющегося выборкой, т. е. группой записей базы данных.
Разрабатывая
программу работы с базой данных, программист не может знать, на каком диске
и в каком каталоге будут находиться файлы базы данных во время ее использования.
Например, пользователь может поместить
базу данных в один из каталогов дисков С:, D: или на сетевой диск. Поэтому возникает
проблема передачи в программу информации о месте нахождения файлов базы данных.
В Delphi
проблема передачи в программу информации о месте нахождения файлов базы данных
решается путем использования псевдонима базы данных. Псевдоним (Alias)
— это короткое имя, поставленное в соответствие реальному, полному имени каталога
базы данных. Например, псевдонимом каталога C:\data\spetersburg может быть имя
Peterburg. Программа работы с базой данных для доступа к данным использует не
реальное имя, а псевдоним.
Для доступа
к информации программа, обеспечивающая работу с базой данных, подключает библиотеку
Borland Database Engine (BDE), которая, в свою очередь, использует конфигурационный
файл, содержащий информацию о всех зарегистрированных в системе псевдонимах.
Псевдоним
базы данных может быть создан (зарегистрирован) при помощи утилиты BDE Administrator.
Эта же утилита позволяет изменить каталог, связанный с псевдонимом.
База данных
— это набор файлов (таблиц), в которых находится информация. Как правило, база
данных состоит из нескольких таблиц, которые размещают в одном каталоге. Каталог
для новой базы данных создается обычным образом, например, при помощи Проводника.
Таблицу можно создать, воспользовавшись входящей в состав Delphi утилитой Borland
Database Desktop или организовав SQL-запрос к серверу базы данных.
Так как для
доступа к файлам (таблицам) базы данных библиотека BDE использует не имя каталога,
в котором находятся файлы, а его псевдоним, то перед тем, как приступить к созданию
таблиц новой базы данных, необходимо создать псевдоним для этой базы данных.
Таким образом,
процесс создания базы данных может быть представлен как последовательность следующих
шагов:
1. Создание
каталога.
2. Создание
псевдонима.
3. Создание
таблиц.
Каталог (папка)
для файлов базы данных создается обычным образом, например, при помощи Проводника.
Обычно файлы локальной базы данных помещают в отдельном подкаталоге каталога
программы работы с базой данных.
Примечание
Для дальнейшей
работы с рассматриваемой в качестве примера базой данных "Архитектурные
памятники Санкт-Петербурга" следует в каталоге \ Проекты создать каталог
Петербург и в нем — подкаталог Data.
Псевдоним
базы данных создается при помощи входящей в Delphi утилиты BDE Administrator,
которая запускается из Windows выбором из меню Программы | Borland Delphi
7 команды BDE Administrator.
Вид диалогового
окна BDE Administrator после запуска приведен на рис. 17.2
Рис.
17.2. Окно BDE Administrator
В левой части
окна, на вкладке Databases, перечислены псевдонимы, зарегистрированные
на данном компьютере. Для того чтобы создать новый псевдоним, необходимо из
меню Object выбрать команду New. Затем в открывшемся диалоговом окне
New Database Alias (Новый псевдоним базы данных) из списка Database
Driver Name, в котором перечислены зарегистрированные в системе драйверы
доступа к базам данных, нужно выбрать драйвер для создаваемой базы данных (рис.
17.3), т. е. фактически выбрать тип создаваемой базы данных.
При создании
псевдонима по умолчанию предлагается драйвер STANDARD (default driver),
который обеспечивает доступ к таблицам в формате Paradox.
Рис.
17.3. Диалоговое окно New Database Alias
После выбора
драйвера и щелчка на кнопке ОК в список псевдонимов будет добавлен новый элемент
(рис. 17.4).
Рис.
17.4. Регистрация нового псевдонима
После этого
нужно изменить автоматически созданное администратором имя псевдонима и задать
путь к файлам базы данных, для которой создается псевдоним.
Имя псевдонима
можно изменить обычным для Windows способом: щелкнуть правой кнопкой мыши на
имени псевдонима (на вкладке Databases), в появившемся контекстном меню
выбрать команду Rename (Переименовать) и в открывшемся диалоговом окне
ввести новое имя.
Путь к файлам
базы данных можно ввести на вкладке Definition в поле Path с клавиатуры
или воспользоваться стандартным диалоговым окном Select Directory (Выбор
каталога), которое открывается щелчком на кнопке с тремя точками, находящейся
в конце поля Path.
В качестве
примера на рис. 17.5 приведен вид, окна BDE Administrator после создания
псевдонима Peterburg для базы данных "Архитектурные памятники Санкт-Петербурга".
Для того
чтобы созданный псевдоним был зарегистрирован в файле конфигурации (Idapi.cfg),
необходимо в меню Object выбрать команду Apply (Применить). В
открывшемся диалоговом окне Confirm следует подтвердить необходимость
сохранения изменений в файле конфигурации.
Рис.
17.5. Результат создания псевдонима
Важным моментом
при создании базы данных является распределение информации между полями записи.
Очевидно, что информация может быть распределена между полями различным образом.
Например,
сведения об исторических памятниках Санкт-Петербурга могут быть организованы
в виде записей, состоящих из полей "Памятник" и "Историческая
справка" или из полей "Памятник", "Архитектор", "Год"
и "Историческая справка".
В первом
варианте поле "Памятник" будет содержать название памятника, например
Эрмитаж, а поле "Историческая справка" - - всю остальную информацию.
При этом пользователь сможет найти информацию об интересующем его памятнике
только по названию. При втором варианте организации записи пользователь сможет
найти информацию о памятниках, архитектором которых является конкретный зодчий,
или о памятниках, возведенных в данный исторический период.
Можно сформулировать
следующее правило: если предполагается, что во время использования базы данных
будет выполняться выборка информации по некоторому критерию, то информацию,
обеспечивающую возможность этой выборки, следует поместить в отдельное поле.
После того
как определены поля записи, необходимо выполнить распределение полей по таблицам.
В простой базе данных все поля можно разместить в одной таблице. В сложной базе
данных поля распределяют по нескольким таблицам, и вводом некоторой дополнительной
информации, однозначно идентифицирующей каждую запись, обеспечивается связь
между таблицами.
Примечание Базы данных,
состоящие из нескольких, связанных между собой таблиц, называются реляционными.
В реляционных базах данных, для того чтобы избежать дублирования информации
в таблицах, к основной информации добавляется некоторая служебная информация,
которая однозначно идентифицирует запись. Подробное рассмотрение организации
реляционных баз данных в задачу этой книги не входит. Читатель может самостоятельно
ознакомиться с вопросами организации реляционных баз данных, обратившись к литературе.
После того
как определена структура записей базы данных, можно приступить непосредственно
к созданию таблицы. Таблицы создаются при помощи входящей в состав Delphi утилиты
Database Desktop.
Утилита Database
Desktop позволяет выполнять все необходимые при работе с базами данных действия.
Она обеспечивает создание, просмотр и модификацию таблиц баз данных различных
форматов (Paradox, dBASE, Microsoft Access). Кроме того, утилита позволяет выполнять
выборку информации путем создания запросов.
Для того
чтобы создать новую таблицу, нужно выбором из меню Tools команды Database
Desktop запустить Database Desktop. Затем в появившемся окне утилиты Database
Desktop надо из меню File выбрать команду New и в появившемся списке
выбрать тип создаваемого файла — Table. Затем в открывшемся диалоговом
окне Create Table следует выбрать тип создаваемой таблицы (значением
по умолчанию является тип Paradox 7).
В результате
открывается диалоговое окно Create Paradox 7 Table,
в котором можно определить структуру записей таблицы.
Для каждого
поля таблицы необходимо задать имя, тип и, если нужно, размер поля. Имя поля
используется для доступа к данным. В качестве имени поля, которое вводится в
колонку Field Name, можно использовать последовательность из букв латинского
алфавита и цифр длиной не более 25 символов.
Тип поля
определяет тип данных, которые могут быть помещены в поле. Тип задается вводом
в колонку Туре символьной константы. Типы полей и соответствующие им константы
приведены в табл. 17.1.
Таблица
17.1. Тип поля определяет тип информации, которая может в нем находиться
Константа,
определяющая тип поля, может быть введена с клавиатуры или путем выбора
типа поля из списка, который появляется при щелчке правой кнопкой мыши в колонке
Туре или при нажатии клавиши < Пробел >.
Одно или
несколько полей можно пометить как ключевые. Ключевое поле определяет
логический порядок следования записей в таблице. Например, если символьное
(тип Alpha) поле Fam (Фамилия) пометить как ключевое, то при выводе таблицы
записи будут упорядочены в соответствии с алфавитным порядком
фамилий. Если поле Fam не помечать как ключевое, то записи будут выведены в
том порядке, в котором они были введены в таблицу. Следует обратить внимание
на то, что в таблице не может быть двух записей с одинаковым содержимым ключевых
полей. Поэтому в рассматриваемом примере ключевыми полями должны быть поля Fam
(Фамилия) и Name (Имя). Тогда в таблицу можно будет ввести информацию об однофамильцах.
Однако по-прежнему нельзя будет ввести однофамильцев, у которых совпадают имена.
Поэтому в качестве ключевого поля обычно выбирают поле, которое содержит уникальную
информацию. Для таблицы, содержащей список людей, в качестве ключевого можно
выбрать поле Pasp (Паспорт).
Для того
чтобы пометить поле как ключевое, необходимо выполнить двойной щелчок в колонке
Key. Следует обратить внимание на то, что ключевые поля должны быть сгруппированы
в верхней части таблицы.
Если данные,
для хранения которых предназначено поле, должны обязательно присутствовать в
записи, то следует установить флажок Required Field. Например, очевидно,
что поле Fam (Фамилия) обязательно должно быть заполнено, в то время как поле
Tel (Телефон) может оставаться пустым.
Если значение,
записываемое в поле, должно находиться в определенном диапазоне, то вводом значений
в поля Minimum value (Минимальное значение) и Maximum value (Максимальное
значение) можно задать границы диапазона.
Поле Default
value позволяет задать значение по умолчанию, которое будет автоматически
записываться в поле при добавлении к таблице новой записи.
Поле Picture
позволяет задать шаблон, используя который можно контролировать правильность
вводимой в поле информации. Шаблон представляет собой последовательность обычных
и специальных символов. Специальные символы перечислены в табл. 17.2.
Во время
ввода информации в позицию поля, которой соответствует специальный символ, будут
появляться только символы, допустимые для данного символа шаблона. Например,
если в позиции шаблона стоит символ #, то в соответствующую этому символу позицию
можно ввести только цифру. Если в позиции шаблона стоит обычный символ, то во
время ввода информации в данной позиции будет автоматически появляться указанный
символ.
Например,
пусть поле Tel типа А (строка символов) предназначено для хранения номера телефона,
и программа, работающая с базой данных, предполагает, что номер телефона должен
быть представлен в обычном виде, т. е. в виде последовательности сгруппированных,
разделенных дефисами цифр. В этом случае в поле Picture следует записать
шаблон: ###-##-##. При вводе информации в поле Tel будут появляться только цифры
(нажатия клавиш с другими символами игнорируются), причем после ввода третьей
и пятой цифр в поле будут автоматически добавлены дефисы.
Таблица
17.2. Специальные символы, используемые при
записи шаблонов
Некоторые
элементы данных поля могут быть необязательными, например, код города для номера
телефона. Элементы шаблона, обеспечивающие ввод необязательных данных, заключают
в квадратные скобки. Например, шаблон [(###)]###-##-## позволяет вводить в поле
номер телефона как с заключенным в скобки кодом города, так и без кода.
Шаблоны позволяют
не только контролировать правильность вводимых в поле данных путем блокирования
ввода неверных символов, но и обеспечивают автоматизацию ввода данных. Это достигается
путем указания в шаблоне в квадратных или фигурных скобках списка допустимых
значений содержимого поля.
Например,
если для поля Address задать шаблон
{Санкт-Петербург, Москва, Воронеж}*@ или [Санкт-Петербург, Москва, Воронеж]*@,
то во время ввода данных в это поле название соответствующего города будет появляться
сразу после ввода одной из букв: с, м или в. Отличие фигурных скобок от квадратных
и, следовательно, этих шаблонов друг от друга состоит в том, что в первом шаблоне
содержимое поля обязательно должно начинаться с названия одного из перечисленных
в списке городов, а во втором — город может называться по-другому, однако его
название придется вводить полностью.
После того
как будет определена структура таблицы, таблицу следует сохранить. Для этого
необходимо нажать кнопку Save As. В результате открывается окно Save
Table As. В этом окне из списка Alias нужно выбрать псевдоним базы
данных, частью которой является созданная таблица, а в поле Имя файла ввести
имя файла, в котором нужно сохранить созданную таблицу.
Если перед
тем как нажать кнопку Сохранить установить флажок Display table, то
в результате нажатия кнопки Сохранить открывается диалоговое окно Table
, в котором можно ввести данные в только что созданную таблицу.
Если таблица
базы данных недоступна, то для того чтобы ввести данные в таблицу, таблицу нужно
открыть. Для этого надо из меню File выбрать команду Open | Table,
затем в появившемся диалоговом окне Open table в списке Alias
выбрать псевдоним нужной базы данных и таблицу. Следует обратить внимание,
что таблица будет открыта в режиме просмотра, в котором изменить содержимое
таблицы нельзя. Для того чтобы в таблицу можно было вводить данные, нужно активизировать
режим редактирования таблицы, для чего необходимо из меню Table выбрать
команду Edit Data.
Данные в
поля записи вводятся с клавиатуры обычным образом. Для перехода к следующему
полю нужно нажать клавишу <Enter>. Если поле является последним полем
последней записи, то в результате нажатия клавиши <Enter> в таблицу будет
добавлена еще одна запись.
Если во время
заполнения таблицы необходимо внести изменения в какое-то уже заполненное поле,
то следует выбрать это поле, воспользовавшись клавишами перемещения курсора,
нажать клавишу <F2> и внести нужные изменения.
Если при
вводе данных в таблицу буквы русского алфавита отображаются неверно, то надо
изменить шрифт, используемый для отображения данных. Для этого необходимо в
меню Edit выбрать команду Preferences и в появившемся диалоговом
окне, во вкладке General, щелкнуть на кнопке Change. В результате
этих действий откроется диалоговое окно Change Font, в котором нужно
выбрать русифицированный шрифт. Следует обратить внимание, что в Windows 2000
(Windows XP) используются шрифты типа Open Type, в то время как программа Database
Desktop ориентирована на работу со шрифтами TrueType. Поэтому в списке шрифтов
нужно выбрать русифицированный шрифт именно TrueType. После этого надо завершить
работу с Database Desktop, так как внесенные в конфигурацию изменения будут
действительны только после перезапуска утилиты.
Программа
управления базой данных
Процесс создания
программы управления базой данных рассмотрим на примере создания базы данных
"Архитектурные памятники Санкт-Петербурга".
Перед тем
как приступить непосредственно к разработке приложения управления базой данных,
необходимо, используя утилиту Database Desktop, создать файл данных (таблицу)
и добавить в нее несколько записей. В табл. 17.3 перечислены поля таблицы monuments
(monuments — монументы, памятники). В таблицу monuments можно внести информацию
о памятниках Санкт-Петербурга (табл. 17.4).
Таблица
17.3. Поля таблицы monuments
Таблица 17.4. Памятники
Санкт-Петербурга
Примечание На прилагаемой
к книге дискете есть файлы, содержащие изображения исторических памятников Санкт-Петербурга.
Теперь можно
приступить к разработке приложения. Методика разработки приложения работы с
базой данных ничем не отличается от методики создания обычной программы: к форме
добавляются необходимые компоненты, устанавливаются значения свойств компонентов,
разрабатываются необходимые процедуры обработки событий.
Приложение
работы с базой данных должно содержать компоненты, обеспечивающие доступ к данным,
возможность просмотра и редактирования содержимого полей. Компоненты доступа
к данным находятся на вкладке Data Access палитры компонентов, а компоненты
отображения данных — на вкладке Data Controls.
Доступ
к базе данных (таблице)
Доступ к
базе данных обеспечивают компоненты Database, Table, Query и DataSource,
значки которых находятся на вкладках Data Access и BDE палитры
компонентов (рис. 17.6).
Рис.
17.6. Компоненты вкладок Data Access и BDE обеспечивают
доступ к данным
Компонент
Database представляет базу данных как единое целое, т. е. совокупность таблиц,
а компонент Table — одну из таблиц базы данных. Компонент DataSource (источник
данных) обеспечивает связь компонента отображения-редактирования данных (например,
компонента DBGrid) и источника данных, в качестве которого может выступать таблица
(компонент Tаblе) или результат выполнения SQL-запроса к таблице (компонент
SQL). Компонент DataSource позволяет оперативно выбирать источник данных, использовать
один и тот же компонент, например, DBGrid для отображения данных из таблицы
или результата выполнения SQL-запроса к этой таблице. Механизм взаимодействия
компонентов отображения-редактирования данных с данными через компонент DataSource
иллюстрирует рис. 17.7.
Рис.
17.7. Взаимодействие компонентов отображения и доступа к данным
В простейшем
случае, когда база данных представляет собой одну-единственную таблицу, приложение
работы с базой данных должно содержать один компонент Table и один компонент
DataSource.
В табл. 17.5
перечислены свойства компонента Table, а в табл. 17.6 — свойства компонента
DataSource. Свойства перечислены в том порядке, в котором следует устанавливать
их значения после добавления компонентов в форму приложения.
Таблица
17.5. Свойства компонента Table
Во время
разработки формы приложения значения свойств DatabaseName и TabieName задаются
путем выбора из списков. В списке DatabaseName перечислены все зарегистрированные
псевдонимы, а в списке TabieName -имена файлов таблиц, которые находятся
в соответствующем псевдониму каталоге.
Таблица
17.6. Свойства компонента DataSource
Свойство
DataSet обеспечивает связь между компонентом, представляющим собой таблицу или
запрос, и компонентами, предназначенными для доступа к записям. Наличие этого
свойства позволяет выбирать источник данных. Например, база данных может быть
организована таким образом, что таблица, состоящая из большого числа записей,
разделена на несколько подтаблиц, имеющих одинаковую структуру. В этом случае
в приложении каждой подтаблице будет соответствовать свой компонент Table, а
выбор конкретной подтаблицы можно осуществить установкой значения свойства DataSet.
В табл. 17.7
и 17.8 приведены значения свойств компонентов Table и DataSource для разрабатываемого
приложения.
Таблица
17.7. Значения свойств компонента Table
Таблица
17.8. Значения свойств компонента DataSource
Пользователь
может просматривать базу данных в режиме формы или в режиме таблицы. В режиме
формы можно видеть только одну запись, а в режиме таблицы -- несколько записей
одновременно. Довольно часто эти два режима комбинируют. Краткая информация
(содержимое некоторых ключевых полей) выводится в табличной форме, а при необходимости
видеть содержимое всех полей записи выполняется переключение в режим формы.
Компоненты,
обеспечивающие просмотр и редактирование содержимого полей базы данных, находятся
на вкладке Data Controls (рис. 17.8).
Рис.
17.8. Компоненты просмотра и редактирования полей базы данных
Для того
чтобы обеспечить просмотр базы данных в режиме формы, в форму приложения нужно
добавить компоненты, обеспечивающие просмотр и, если нужно, редактирование содержимого
полей записи, причем по одному компоненту для каждого поля.
Компонент
DBText позволяет только просматривать содержимое поля, а компоненты DBEdit и
DBMеmо — просматривать и редактировать. В табл. 17.9 перечислены некоторые свойства
этих компонентов. Свойства перечислены в том порядке, в котором следует устанавливать
их значения после добавления в форму приложения.
Таблица
17.9. Свойства компонентов DBText, DBEdit и DBMето
В качестве
примера использования компонентов DBEdit и овмето рассмотрим программу, которая
обеспечивает работу с базой данных "Архитектурные памятники Санкт-Петербурга".
Вид формы приложения приведен на рис. 17.9.
Рис.
17.9. Форма приложения Архитектурные памятники Санкт-Петербурга
Создается
форма следующим образом. Сначала в пустую форму надо добавить компоненты Tаblе
и Datasource и установить значения их свойств (табл. 17.10). Значения свойств
следует устанавливать в том порядке, в котором они следуют в таблице.
Таблица
17.10. Значения свойств компонентов Tablel
И DataSourcel
После настройки
компонентов Table и Datasource в форму нужно добавить три компонента DBEdit
и компонент овмето. Компоненты DBEdit предназначены для просмотра и редактирования
полей Name, Architect и Photo,
компонент
овмето — для просмотра и редактирования поля Note. Значения свойств компонентов
просмотра-редактирования полей базы данных приведены в табл. 17.11.
Таблица
17.11. Значения свойств компонентов DBEdit1
-DBEdit3 и DBMemo1
Так как значению
свойства Active компонента Tаblе1 присвоено значение True, то сразу после того,
как будет присвоено значение свойству DataFieid, в поле компонента DBEdit появится
содержимое соответствующего поля первой записи таблицы базы данных. Если таблица
не содержит данных, поле остается незаполненным. Если значение свойства Active
компонента Tabiei равно False, то в поле компонента DBEdit появляется его имя,
значение свойства Name.
Кроме компонентов
просмотра-редактирования полей базы данных, в форму нужно добавить компонент
image, который используется для просмотра иллюстраций, и четыре компонента Label
для вывода пояснительного текста. свойству Visible компонентов Image1, Label4
и DBEdit3 следует присвоить значение False.
Теперь, если
откомпилировать и запустить программу, на экране появится форма, в полях которой
будет находиться содержимое первой записи файла данных.
Для того
чтобы иметь возможность просматривать другие записи файла данных, в форму приложения
нужно добавить компонент DBNavigator, значок которого находится на вкладке Data
Controls (рис. 17.10). Компонент DBNavigator (рис. 17.11) представляет собой
набор кнопок, при щелчках на которых во время работы программы происходит перемещение
указателя текущей записи к следующей, предыдущей, первой или последней записи
базы данных, а также добавление к файлу данных новой записи, удаление текущей
записи.
Рис.
17.10. Значок компонента DBNavigator находится на вкладке Data Controls
Рис.
17.11. Компонент DBNavigator
Табл. 17.12
содержит описания действий, которые выполняются в результате щелчка на соответствующей
кнопке компонента DBNavigator.
Свойства
компонента DBNavigator перечислены в табл. 17.13.
Таблица
17.12. Кнопки компонента DBNavigator
Таблица
17.13. Свойства компонента DBNavigator
Следует обратить
внимание на свойство visibieButtons. Оно позволяет скрыть некоторые кнопки компонента
DBNavigator и тем самым запретить выполнение соответствующих операций над файлом
данных. Например, присвоив значение False свойству VisibieButtons.nbDelete
можно скрыть кнопку
nbDelete и тем самым запретить удаление записей.
На рис. 17.12
приведен вид формы приложения Архитектурные памятники Санкт-Петербурга после
добавления компонента DBNavigator. Свойству DataSource компонента DBNavigator1
следует присвоить значение Table1.
Рис.
17.12. Окончательный вид формы приложения Архитектурные памятники
Санкт-Петербурга
В принципе,
после добавления в форму компонента DBNavigator простейшая программа управления
базой данных готова. Эта программа обеспечивает просмотр, редактирование, добавление
новых и удаление ненужных записей.
Теперь рассмотрим,
что надо сделать, чтобы в поле imagei появилось изображение памятника, информация
о котором выведена в форме. Разрабатываемое приложение предполагает, что изображения
(фотографии) архитектурных памятников находятся в файлах в том же каталоге,
что и таблица базы данных. Во время добавления информации в базу данных пользователь
вводит в поле Photo имя файла фотографии, а во время просмотра фотография автоматически
появляется в поле image 1.
В листинге
17.1 приведен текст модуля программы Архитектурные памятники Санкт-Петербурга.
Листинг
17.1. База данных "Архитектурные памятники Санкт-Петербурга"
unit peter_; uses Windows, Messages, SysUtils,
Classes, Graphics, Controls,
Forms, DBCtrls, Mask, Db, DBTables, type TForml = class(TForm) Tablel: TTable; . // база
данных — таблица DataSourcel: TDataSource;
// источник данных для полей // редактирования-просмотра Label1: TLabel; Label2: TLabel; Label3: TLabel; DBEditl: TDBEdit; DBEdit2: TDBEdit; DBMemo1: TDBMemo; Image1: ТImage; DBEdit3: TDBEdit; DBNavigatorl: TDBNavigator; Label4: TLabel; procedure TablelAfterScroll(DataSet:
TDataSet); procedure DBEdit3KeyPress(Sender:
TObject; var Key: Char); procedure DBNavigatorlClick(Sender:
TObject; Button: TNavigateBtn) procedure TablelBeforeOpen(DataSet:
TDataSet); { Private declarations
} { Public declarations
} var Forml: TForml; BmpPath: string; //
Путь к файлам иллюстраций. Иллюстрации // находятся в подкаталоге
Data каталога программы. implementation ($R *.DFM} // выводит фотографию
в поле Imagel Forml.Imagel.Picture.LoadFromFile(BmpPath+foto); on EFOpenError do MessageDlg('Файл иллюстрации
'+foto+' не найден.', mtlnformation, [mbOk], 0)
; // переход к другой записи
(следующей, предыдущей, procedure TForm1.TablelAfterScroll(DataSet:
TDataSet); if form1.DBEdit3.Visible
then form1.DBEditS.Visible :=
False; then ShowFoto(Form1.DBEditS.Text) // нажатие клавиши в поле
Фото procedure TForml.DBEdit3KeyPress(Sender:
TObject; var Key: Char); if (key = #13) then if Forml.DBEdit3.Text
<>'' then ShowFoto(Forml.DBEdit3.Text)
// показать иллюстрацию // щелчок на компоненте
Навигатор procedure TForml.DBNavigatorlClick(Sender:
TObject; Button: begin case Button of Imagel.Visible:=False;//
скрыть область вывода иллюстрации DBEdit3.Visible:=True; //
показать поле Фото end; end; // перед открытием таблицы procedure TForml.TablelBeforeOpen(DataSet:
TDataSet); begin BmpPath:=ExtractFilePath(ParamStr(0))+'data\'; end.
end.
Вызов процедуры
вывода фотографии (showFoto) во время просмотра базы данных выполняет процедура
TForm1.Table1AfterScroll, которая обеспечивает обработку события AfterScrool
для компонента Table1. Событие AfterScrool происходит всякий раз после перехода
к другой (следующей, предыдущей, первой, последней) записи таблицы как результат
щелчка пользователя на соответствующей кнопке компонента DBNavigator. Процедура
TForml.Table1AfterScroll анализирует содержимое поля (photo) Form1.DBEdit3.Text
и, если оно не пустое, что свидетельствует о наличии ссылки на файл фотографии,
выводит иллюстрацию.
При просмотре
базы данных поле имени файла иллюстрации (DBEdits) и его заголовок (Label4)
на форме не отображаются. Если пользователь нажимает одну из кнопок компонента
DBNavigator, то как результат обработки события onclick вызывается процедура
TForm1.DBNavigatorlciick, которая при щелчке кнопки Добавить или Редактировать
делает доступным поле DBEdits, тем самым позволяя пользователю ввести или
изменить имя файла иллюстрации.
Процедура
TForm1.DBEdit3KeyPress обрабатывает событие OnKeyPress для компонента
DBEdits. Если пользователь ввел в поле Edits (photo) имя файла иллюстрации и
нажал клавишу <Enter> (ее код равен 13), то процедура TForm1.DBEdit3KeyPress
выводит иллюстрацию путем вызова процедуры ShowFoto.
Программа
работы с базой данных "Архитектурные памятники Санкт-Петербурга" выводит
информацию в режиме формы, в каждый момент времени пользователь может видеть
только одну запись. Такой режим работы с базой данных не всегда удобен. Если
необходимо видеть одновременно несколько записей базы данных, то нужно обеспечить
просмотр данных в режиме таблицы.
Процесс создания
приложения, обеспечивающего просмотр базы данных в режиме таблицы, рассмотрим
на примере программы работы с базой данных "Школа".
Пусть база
данных "Школа" (псевдоним школа), представляет собой таблицу, которая
находится в файле School.db. Записи таблицы school состоят из полей: Name (Имя),
Fam (Фамилия), class (Класс), Adr (Адрес) и N (Личный номер). Поля Name, Fam,
class и Adr являются полями символьного типа (тип А), а поле N — числовое, с
автоувеличением.
Примечание Псевдоним
Школа следует создать при помощи BDE Administrator, а таблицу (файл school.db)
— при помощи Database Desktop.
Сначала в
форму разрабатываемого приложения нужно добавить компоненты Table и DataSource,
которые обеспечивают доступ к файлу данных, и установить значения их свойств
(табл. 17.14).
Таблица
17.14. Значения свойств компонентов Table1
и DataSource1
Для обеспечения
просмотра и редактирования данных в режиме таблицы в форму приложения надо добавить
компонент DBGrid, значок которого находится на вкладке Data Controls (рис.
17.13). Вид формы разрабатываемого приложения после добавления компонента DBGrid
приведен на рис. 17.14. Рис. 17.13. Значек компонента DBGrid
Рис.
17.14. Форма приложения после добавления компонента DBGrid
Компонент
DBGrid обеспечивает представление базы данных в виде таблицы. Свойства компонента
DBGridl определяют вид таблицы и действия, которые могут быть выполнены над
данными во время работы программы. В табл. 17.15 перечислены некоторые свойства
компонента DBGrid.
Таблица
17.15. Свойства компонента DBGrid
Для того
чтобы задать, какая информация будет отображена в таблице во время работы программы,
нужно сначала определить источник данных для таблицы (установить значения свойства
DataSource), затем — установить значения уточняющих параметров свойства Columns.
Значение свойства DataSource задается обычным образом, то есть в окне Object
Inspector. Чтобы установить значение свойства Columns, надо в окне Object
Inspector выбрать это свойство и щелкнуть на кнопке с тремя точками. В результате
открывается окно редактора колонок (рис. 17.15).
Рис.
17.15. Редактор колонок
Для того
чтобы в компонент DBGrid добавить колонку, обеспечивающую просмотр содержимого
поля записи файла данных, необходимо нажать кнопку Add New, находящуюся на панели
инструментов в верхней части окна (это единственная доступная после запуска
редактора кнопка), выделить добавленный элемент и, используя Object Inspector,
установить значения свойств этой колонки (табл. 17.16). Свойство columns
компонента DBGrid представляет собой массив компонентов типа TCoiumn. Каждой
колонке соответствует элемент массива. Устанавливая значения свойств компонентов
column, программист задает вид колонок компонента DBGrid, тем самым определяет
вид всей таблицы.
Таблица
17.16. Свойства компонента column
В простейшем
случае для каждой колонки достаточно установить значение свойства FieldName,
которое определяет имя поля записи, содержимое которого будет отображаться в
колонке, а также значение свойства Title.Caption, определяющего заголовок колонки.
В табл. 17.17 приведены значения свойств columns компонента DBGridl.
Таблица
17.17. Значения свойств компонента DBGridl
Последнее,
что надо сделать — добавить к форме компонент DBNavigator, настроив его на работу
с таблицей-источником данных (свойству DataSource Нужно Присвоить значение Table1).
Окончательный
вид формы приложения приведен на рис. 17.16.
Рис.
17.16. Форма после настройки компонента DBGrid1
После этого
программу можно откомпилировать и запустить. Следует обратить внимание, что
для того чтобы после запуска программы в окне появилась информация или, если
база данных пустая, можно было вводить новую информацию, свойство Active таблицы-источника
данных должно иметь значение True.
Работа с
базой данных, представленной в виде таблицы, во многом похожа на работу с электронной
таблицей Microsoft Excel. Используя клавиши перемещения курсора вверх и вниз,
а также клавиши листания текста страницами (<Page Up> и <Page Down>),
можно, перемещаясь от строки к строке, просматривать записи базы данных. Нажав
клавишу <Ins>, можно добавить запись, а нажав клавишу <Del> — удалить
запись. Для того чтобы внести изменения в поле записи, нужно, используя клавиши
перемещения курсора влево и вправо, выбрать необходимое поле и нажать клавишу
<F2>. Выбор
информации из базы данных
При работе
с базой данных пользователя, как правило, интересует не все ее содержимое, а
некоторая конкретная информация. Найти нужные сведения можно последовательным
просмотром записей. Однако такой способ поиска неудобен и малоэффективен.
Большинство
систем управления базами данных позволяют произвести выборку нужной информации
путем выполнения запросов. Пользователь в соответствии с определенными
правилами формулирует запрос, указывая, каким критериям должна удовлетворять
интересующая его информация, а система выводит записи, удовлетворяющие запросу.
Для выборки
из базы данных записей, удовлетворяющих некоторому критерию, предназначен компонент
Query (рис. 17.17).
Рис.
17.17. Значок компонента Query
Компонент
Query похож на компонент Table, но, в отличие от последнего, он представляет
не всю базу данных (все записи), а только ее часть — записи, удовлетворяющие
критерию запроса.
В табл. 17.18
перечислены некоторые свойства компонента Query.
Таблица
17.18. Свойства компонента Query
Для того
чтобы во время разработки программы задать, какая информация будет выделена
из базы данных в результате выполнения запроса, свойство SQL должно содержать
представленный на языке SQL запрос на выборку данных.
В общем виде
запрос на выборку из таблицы данных выглядит так:
SELECT
Список-Полей FROM Таблица WHERE (Критерий) ORDER
BY СписокПолей
где:
Например,
запрос
SELECT Fam,
Name FROM ':Школа:school.db' WHERE (Class = '10a')
ORDER BY Name, Fam
обеспечивает
выборку из базы данных "Школа" (из таблицы School.db) записей, у которых
в поле class находится текст 10а, т. е. формирует упорядоченный по алфавиту
список учеников 10-а класса.
Другой пример.
Запрос
SELECT
Fam, Name FROM ":Школа:school.db" WHERE (Fam > 'K')
and (Fam < 'Л') ORDER BY Name, Fam
обеспечивает
выбор информации об учениках, фамилии которых начинаются на букву К.
Запрос может
быть сформирован и записан в свойство SQL во время разработки формы или во время
работы программы.
Для записи
запроса в свойство SQL во время разработки формы используется редактор списка
строк (рис. 17.18), окно которого открывается в результате щелчка на кнопке
с тремя точками в строке свойства SQL окна Object Inspector.
Рис.
17.18. Пример запроса к базе данных "Школа"
Свойство
SQL представляет собой список строк. Поэтому чтобы сформировать запрос во время
работы программы, нужно, используя метод Add, добавить строки (SQL-инструкции)
в список SQL.
Ниже приведен
фрагмент кода, который формирует запрос на поиск информации о конкретном человеке
(критерий выбора — содержимое поля Fam должно совпадать со значением переменной
fam).
with
forml.Queryl do begin
Close; // закрыть
файл — результат выполнения
// предыдущего
запроса
SQL.Clear; //
удалить текст предыдущего запроса
// записываем
новый запрос в свойство SQL
SQL.Add('SELECT
Fam, Name, Class1);
SQL.Add('FROM
":Школа:school.db"');
SQL.Add('WHERE');
SQL.Add('(Fam
= '" + fam + '")');
SQL.Add('ORDER
BY Name, Fam');
Open; // активизируем
выполнение запроса
end;
Следующая
программа, ее текст приведен в листинге 17.2, а диалоговое окно — на рис. 17.19,
демонстрирует возможность изменения запроса, точнее, критерия запроса, во время
работы программы. Программа обеспечивает вывод как всего списка учеников, так
и его части. Например, посредством выполнения запроса выводится информация только
о конкретном ученике.
Для просмотра
базы данных и результата выполнения запроса используется компонент DBGrid1,
который через компонент DataSourcel взаимодействует с компонентом Table1 (при
просмотре всей базы данных) или с компонентом Query (при просмотре результата
выполнения запроса).
Рис.
17.19. Форма приложения База данных Школа Листинг
17.2. База данных "Школа" unit school2_; interface uses Graphics, Controls, Forms, Dialogs,Grids, DBGrids, Db, DBTables, ExtCtrls, DBCtrls, StdCtrls; type var implementation {$R *.DFM} // щелчок на кнопке Запрос { *** другой вариант изменения критерия
запроса // щелчок на кнопке Все записи // активизация формы end.
Процедура
TForm1.Button1Click запускается щелчком кнопки Запрос. Она принимает
от пользователя строку (фамилии) и записью (добавлением) строк
в свойство SQL формирует текст запроса. Затем эта процедура вызовом метода Open
активизирует выполнение запроса.
Следует обратить
внимание на то, что перед изменением свойства SQL-запрос должен быть закрыт
при помощи метода close (здесь надо вспомнить, что результат выполнения запроса
— это файл данных (таблица), который создается в результате выполнения запроса).
Процедура
TForm1.Button2Click, которая запускается щелчком кнопки Все записи, устанавливает
в качестве источника данных для компонента DataSourcel компонент Table1, тем
самым обеспечивая переход в режим просмотра всей базы данных.
Если запрос
записан в свойство SQL во время разработки формы приложения, то во время работы
программы критерий запроса можно изменить простой заменой соответствующей строки
текста запроса.
Например,
для запроса
SELECT DISTINCT
Fam, Name, Class FROM ":Школа:school.db" WHERE (Class= '10а')
ORDER BY Name, Fam
инструкция
замены критерия запроса может быть такой: forml.Query1.SQL[3]:='(Fam="'
+ fam+ '")'
Следует обратить
внимание на то, что свойство SQL является структурой типа TStrings, в которой
строки нумеруются с нуля.
Динамически
создаваемые псевдонимы
Использование
псевдонима для доступа к базе данных обеспечивает независимость программы от
размещения данных в системе, позволяет размещать программу работы с данными
и базу данных на разных дисках компьютера, в том числе и на сетевом. Вместе
с тем, для простых баз данных типичным решением является размещение базы данных
в отдельном подкаталоге того каталога, в котором находится программа работы
с базой данных. Таким образом, программа работы с базой данных всегда "знает",
где находятся данные. При таком подходе можно отказаться от создания псевдонима
при помощи BDE Administrator и возложить задачу создания псевдонима на программу
работы с базой данных. Причем, псевдоним будет создаваться автоматически
во время запуска программы и уничтожаться во время завершения ее работы. Очевидно,
что такой подход облегчает администрирование базы данных.
В качестве
иллюстрации сказанного в листинге 17.3 приведен вариант программы работы с базой
данных "Школа", которая для доступа к базе данных использует динамически
создаваемый псевдоним.
Листинг
17.3. База данных "Школа" (псевдоним БД создается динамически) unit school3_; interface uses type var implementation {$R *.DFM} // щелчок на кнопке Запрос if Query1.RecordCount <> 0 then // щелчок на кнопке Все записи // активизация формы // создадим временный псевдоним для
базы данны end.
В рассматриваемом
варианте программы предполагается, что база данных содержится в подкаталоге
DATA того каталога, в котором находится выполняемый файл программы. Создает
псевдоним процедура TForm1.FormActivate. Непосредственное создание псевдонима
выполняет процедура AddstandardAlias, которой в качестве параметра передается
имя псевдонима и соответствующее ему имя каталога. Так как во время разработки
программы нельзя знать, в каком каталоге будет размещена программа работы с
базой данных и, следовательно, подкаталог базы данных -DATA, имя каталога определяется
во время работы программы путем обращения к функциям ParamStr(0) и ExtractFilePatch.
Значение первой -полное имя выполняемого файла программы, второй — путь к этому
файлу. Таким образом, процедуре AddstandardAiias передается полное имя каталога
базы данных. Перенос
программы управления базой данных на другой компьютер
Довольно
часто возникает необходимость переноса созданной программы управления базой
данных на другой компьютер, например, для того чтобы продемонстрировать ее своим
друзьям или знакомым. В отличие от процесса переноса обычной программы, когда,
как правило, достаточно скопировать только выполняемый файл (ЕХЕ-файл), при
переносе программы управления базой данных необходимо выполнить перенос BDE.
Здесь следует
вспомнить, что BDE представляет собой набор программ, библиотек и драйверов,
обеспечивающих работу прикладной программы с базой данных. Выполнить перенос
BDE на другой компьютер вручную практически невозможно.
Поэтому Borland
рекомендует создавать установочную программу, которая выполнит копирование всех
необходимых файлов, в том числе и компонентов BDE. В качестве средства создания
установочной программы Borland настоятельно рекомендует использовать утилиту
InstallShield Express, которая входит в состав всех наборов Delphi. Поставляемая
с Delphi версия этой утилиты специально адаптирована к задаче переноса и настройки
BDE.
Можно попытаться
установить BDE вручную. Ниже перечислены файлы (их имена определены опытным
путем), необходимые для работы с базой данных Paradox:
Эти файлы
нужно установить на компьютер пользователя, затем проверить, что в реестре Windows
есть перечисленные ниже разделы и параметры:
|
®Сайт разработал: Nek по вопросам пишите сюда NekSuper@yandex.ru |