Базы данных 6 Г Л А В А

advertisement
ГЛАВА
6
Базы данных
C++ Builder предоставляет программисту компоненты, используя которые он
может создать программу работы практически c любой базой данных: от
Microsoft Access до Microsoft SQL Server и Oracle.
База данных и СУБД
База данных — это файл или совокупность файлов определенной структуры,
в которых находится информация. Программная система, обеспечивающая
работу с базой данных, называется системой управления базой данных
(СУБД). СУБД позволяет создать базу данных, наполнить ее информацией,
решить задачи отображения и поиска данных. Типичным примером СУБД
является Microsoft Access.
Локальные и удаленные базы данных
В зависимости от расположения данных и программы, которая обеспечивает
доступ к ним, а также от способа разделения данных между несколькими
пользователями различают локальные и удаленные базы данных.
В локальной базе файлы данных обычно находятся на диске того же компьютера, на котором работает программа манипулирования данными. Локальные
базы данных не обеспечивают одновременный доступ к информации нескольким пользователям. Несомненным достоинством локальных баз является высокая скорость доступа к информации. Microsoft Access — это типичная
локальная база данных.
В удаленных базах данные размещают на отдельном компьютере (сервере).
Программы, обеспечивающие работу с удаленными базами, строят по техно-
226
Часть II. Практикум программирования
логии "клиент-сервер". Клиент (программа, работающая на компьютере
пользователя) обеспечивает прием команд от пользователя, передачу их серверу, получение и отображение данных. Сервер (программа, работающая на
удаленном компьютере) принимает запросы от клиента, выполняет их и пересылает данные клиенту. Сервер проектируется так, чтобы обеспечить доступ к данных многим пользователям. Взаимодействие клиента и сервера
осуществляется по сети на основе протокола TCP/IP. В большинстве случаев
в качестве сервера используется сервер баз данных (например, Microsoft SQL
Server, MySQL, Interbase или другой). Таким образом, разработка программы
работы с удаленной базой данных в большинстве случаев сводится к разработке программы-клиента.
Структура базы данных
База данных — это набор однородной, как правило, упорядоченной по некоторому критерию информации (или, другими словами, записей).
На практике наиболее широко используются реляционные базы данных. Реляционная база данных — это совокупность таблиц данных. Например, базу
данных Projects (Проекты) можно представить как совокупность таблиц
Projects (Проекты), Tasks (Задачи) и Resources (Ресурсы), а базу данных
Contacts (Контакты) — одной-единственной таблицей Contacts (Контакты).
Строки таблиц данных называют записями. Записи содержат информацию об
объектах базы данных. Они состоят из полей, которые, в свою очередь, содержат информацию о характеристиках объектов. При представлении данных
в табличной форме имена полей указывают в заголовках столбцов, номера
записей — в первом столбце.
В качестве примера на рис. 6.1 приведены таблицы базы данных Projects
(Проекты). Таблица Projects содержит информацию о проектах (идентификатор и название проекта, даты начала и завершения, состояние), таблица
Tasks — о задачах (идентификатор и название задачи, дата, когда работы по
выполнению задачи должны быть начаты, статус задачи, длительность задачи, идентификатор проекта, к которому относится задача, и идентификатор
ресурса, который должен обеспечить выполнение задачи), таблица
Resource — о ресурсах (идентификатор и название).
Обратите внимание: поля ProjID, TaskID и ResID обеспечивают связь между
таблицами. Например, зная имя проекта можно из таблицы Project получить
идентификатор проекта, а затем из таблицы Task — список задач, относящихся к этому проекту. Аналогичным образом, зная идентификатор задачи, можно получить из таблицы Resource имя ресурса, обеспечивающего выполнение
задачи.
227
Глава 6. Базы данных
Рис. 6.1. Таблицы база данных Projects (Проекты)
Механизмы доступа к данным
Существует достаточно много технологий доступа к данным: BDE, ADO,
dbExpress и др.
Технология Borland Database Engine — (BDE) механизм доступа к данным,
основой которой является процессор баз данных, представляющий собой набор динамических библиотек, драйверов и утилит. BDE обеспечивает работу
практически с любой из существующих баз данных. Однако при всех своих
достоинствах технология BDE не лишена недостатков, одним из которых является достаточно трудоемкий процесс развертывания приложений, созданных на ее основе: помимо программы работы с базой данных, на компьютер
пользователя необходимо установить BDE и выполнить его настройку.
Технология ActiveX Data Object (ADO) разработана Microsoft. В настоящее
время именно она наиболее широко используется для доступа к данным. Не-
228
Часть II. Практикум программирования
сомненным ее достоинством является возможность получения данных из различных источников. Эта возможность обеспечивается соответствующими
драйверами.
Технология dbExpress — это разработанная Borland технология однонаправленного (unidirect) доступа к данным, отличительной особенностью которой
является высокая скорость доступа.
Компоненты доступа к данным
Компоненты, обеспечивающие доступ к данным, находятся на вкладках
dbGo, dbExpress, InterBase и BDE.
Компоненты вкладки dbGo для доступа к данным используют разработанную
Microsoft технологию ADO. Компоненты dbExpress обеспечивают высокоэффективный однонаправленный (unidirectional) доступ к удаленным базам
данных на основе разработанной Borland технологии dbExpress. Компоненты
вкладки InterBase оптимизированы для работаты с базами данных InterBase.
Компоненты вкладки BDE для доступа к данным используют процессор баз
данных Borland Database Engine.
Следует обратить внимание на то, что компоненты доступа к данным напрямую с базами данных не взаимодействуют — доступ к данным обеспечивают
соответствующие драйверы. Таким образом, чтобы компонент мог взаимодействовать с базой данных, на компьютере должен быть установлен соответствующий драйвер. На компьютер разработчика драйверы баз данных
устанавливаются в процессе установки среды разработки.
Компоненты отображения данных
На вкладке DataControls находятся компоненты, обеспечивающие отображение данных. Компонент DataGrid используется для отображения данных в
табличной форме. Компоненты DBEdit, DBText обеспечивают отображение
содержимого отдельных полей.
База данных Microsoft Access
Microsoft Access является популярной системой ведения баз данных. Это
объясняется сочетанием удобства работы, широкими возможностями, предоставляемыми системой пользователям и разработчикам, возможностью
доступа к данным из офисных приложений.
Процесс разработки программы работы с базой данных Microsoft Access рассмотрим на примере. Создадим приложение, обеспечивающее работу с базой
229
Глава 6. Базы данных
данных Контакты (contacts.mdb). Для доступа к данным будем использовать
технологию ADO.
Перед тем как приступить к непосредственной работе в C++ Builder, необходимо с помощью Microsoft Access создать (например, в папке D:\Database\) файл
базы данных contacts.mdb и поместить в него таблицу Contacts (табл. 6.1).
Также в каталоге D:\Database\ следует создать каталог Images. В этом каталоге
будем хранить иллюстрации.
Таблица 6.1. Тaблица Contacts базы данных Контакты (contacts.mdb)
Поле
Тип
Размер
Описание
Name
Текстовый
50
Имя
Phone
Текстовый
30
Телефон
Comment
Текстовый
100
Комментарий (дополнительная информация)
Image
Текстовый
30
Имя файла иллюстрации (например,
фотографии)
Доступ к данным
Доступ к данным при использовании технологии ADO обеспечивают компоненты ADOConnection, ADODataSet, ADOTable и ADOQuery, которые находятся на
вкладке dbGo (рис. 6.2).
Рис. 6.2. Компоненты вкладки dbGo обеспечивают доступ к данным
Компонент ADOConnection обеспечивает соединение с базой данных (источником данных).
Компонент ADODataSet представляет собой данные, полученные от источника
данных в результате выполнения SQL-запроса.
Компонент ADOTable также представляет собой данные, полученные из базы
данных, но, в отличие от компонента ADODataSet, который может быть запол-
230
Часть II. Практикум программирования
нен информацией из разных таблиц, этот компонент представляет собой данные, полученные из одной таблицы.
Компонент ADOQuery представляет собой данные, полученные из базы данных
в результате выполнения SQL-команды.
Для связи между данными, в качестве которых может выступать компонент
или ADOQuery, и компонентом, обеспечивающим отображение данных (например, DBGrid), используется компонент DataSource.
ADODataSet, ADOTable
Механизм взаимодействия компонентов, обеспечивающих доступ к данным и
их отображение, показан на рис. 6.3.
Рис. 6.3. Взаимодействие компонентов, обеспечивающих доступ к данным
и их отображение
В форму программы работы с базой данных Контакты надо добавить компоненты ADOConnection, ADODataSet, DataSourse и DBGrid (рис. 6.4). Компоненты
рекомендуется добавлять в том порядке, в котором они перечислены, и сразу
настраивать. Необходимо отметить, что компоненты ADOConnection,
ADODataSet, DataSourse являются невизуальными (в окне программы во время
ее работы не видны). Поэтому их можно поместить в любую область формы.
Компонент ADOConnection (его свойства приведены в табл. 6.2) обеспечивает
соединение с базой данных.
231
Глава 6. Базы данных
Рис. 6.4. Форма программы работы с базой данных Контакты
Таблица 6.2. Свойства компонента ADOConnection
Свойство
Описание
ConnectionString
Строка соединения. Содержит информацию, необходимую
для подключения к базе данных
LoginPrompt
Признак необходимости запроса имени и пароля пользователя в момент подключения к базе данных. Если значение
свойства равно false, то окно Login в момент подключения
к базе данных не отображается
Mode
Режим соединения. Соединение с базой данных может быть
открыто для чтения (cmRead), записи (cmWrite), чтения/записи (cmReadWrite)
Connected
Признак того, что соединение установлено
Настраивается компонент ADOConnection следующим образом:
1. Сначала в окне Object Inspector надо выбрать свойство ConnectionString
и сделать щелчок на кнопке с тремя точками, которая находится в поле
значения этого свойства.
2. Затем в появившемся окне (рис. 6.5) надо нажать кнопку Build.
3. После этого в открывшемся окне Свойства связи с данными на вкладке
Поставщик данных нужно выбрать тип источника данных (для базы данных Microsoft Access — это Microsoft Jet 4.0 OLE DB Provider) и щелкнуть на кнопке Далее (рис. 6.6).
232
Часть II. Практикум программирования
Рис. 6.5. Настройка соединения с базой данных (шаг 1)
Рис. 6.6. Настройка соединения с базой данных (шаг 2)
4. Затем на вкладке Подключение (рис. 6.7) надо задать базу данных — сделать щелчок на кнопке с тремя точками (...) и в открывшемся окне выбрать
файл базы данных. Если для доступа к базе необходим пароль и идентификатор пользователя, то их надо указать (по умолчанию к базе данных,
созданной в Microsoft Access, доступ есть у пользователя Admin, но пароль для доступа не нужен).
233
Глава 6. Базы данных
Рис. 6.7. Настройка соединения с базой данных (шаг 3)
5. После этого можно сделать щелчок на кнопке Проверить подключение,
убедиться, что соединение с базой данных настроено правильно, и щелчком на кнопке OK закрыть окно Свойства связи с данными.
6. После этого, если для доступа к базе данных пароль не нужен, необходимо
присвоить значение false свойству LoginPrompt.
Значения свойств компонента ADOConnection1 после его настройки приведены
в табл. 6.3.
Таблица 6.3. Значения свойств компонента ADOConnection1
Свойство
Значение
Name
ADOConnection1
ConnectionString
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=D:\Database\contacts.mdb;
Persist Security Info=false
LoginPrompt
false
Connected
false
234
Часть II. Практикум программирования
После того как будет настроен компонент ADOConnection, можно приступить
к настройке компонента ADODataSet.
Компонент ADODataSet (набор данных) хранит данные, полученные из базы
данных. Свойства компонента ADODataSet приведены в табл. 6.4.
Таблица 6.4. Свойства компонента ADODataSet
Свойство
Описание
Connection
Ссылка на компонент (ADOConnection), который обеспечивает
соединение с источником (базой) данных
CommandText
Команда, которая направляется серверу
Parameters
Параметры команды
Filter
Фильтр. Позволяет отобрать записи, удовлетворяющие критерию
отбора
Filtered
Признак использования фильтра
Activate
Открывает или делает недоступным набор данных
В базе данных contacts.mdb информация хранится в таблице Contacts. Для
того чтобы информация из этой таблицы попала в компонент ADODataSet, в
свойство CommandText нужно записать SQL-команду, обеспечивающую выбор
необходимой информации. Выбор информации из таблицы базы данных
обеспечивает команда SELECT. В простейшем случае, когда надо получить всю
информацию, которая находится в таблице, в качестве параметров команды
SELECT нужно указать таблицу, имена полей и, возможно, поле, по содержимому которого данные должны быть упорядочены. Например, SQL-команда,
обеспечивающая чтение данных из таблицы Contacts, выглядит так:
SELECT Name, Phone FROM Contacts ORDER BY Name
Значения свойств компонента ADODataSet1 приведены в табл. 6.5.
Таблица 6.5. Значения свойств компонента ADODataSet1
Свойство
Значение
Name
ADODataSet1
Connection
ADOConnection1
CommandText
SELECT Name, Phone FROM Contacts ORDER BY Name
Activate
false
235
Глава 6. Базы данных
Завершив настройку компонента ADODataSet, можно приступить к настройке
компонента DataSource — задать значение свойства DataSet, которое определяет набор данных, связь с которым обеспечивает компонент (табл. 6.6).
Таблица 6.6. Значения свойств компонента DataSource1
Свойство
Значение
DataSet
ADODataSet1
Отображение данных
Пользователь может работать с базой данных в режиме таблицы или в режиме формы. В режиме таблицы информация отображается в виде таблицы, что
позволяет видеть одновременно несколько записей. Этот режим обычно используется для просмотра информации. В режиме формы отображается одна
запись. Обычно этот режим используется для ввода и редактирования информации. Часто эти два режима комбинируют, краткая информация (содержимое ключевых полей) выводится в табличной форме, а при необходимости
видеть содержимое всех полей выполняется переключение в режим формы.
Отображение данных в табличной форме обеспечивает компонент DBGrid
(рис. 6.8). Свойства компонента (табл. 6.7) определяют вид таблицы и действия, которые могут быть выполнены над данными во время работы программы.
DBGrid
Рис. 6.8. Значок компонента DBGrid
Таблица 6.7. Свойства компонента DBGrid
Свойство
Описание
DataSource
Ссылка на источник данных (например, ADODataSet)
Columns
Отображаемая информация (столбцы)
BorderStyle
Вид границы вокруг компонента
236
Часть II. Практикум программирования
Таблица 6.7 (окончание)
Свойство
Описание
Options.dgEditing
Разрешает (true) изменение, добавление и удаление
данных. Чтобы во время работы программы активизировать режим редактирования записи, надо нажать
клавишу <F2>; чтобы добавить запись — клавишу
<Insert>; чтобы удалить запись — комбинацию клавиш
<Ctrl>+<Del> или клавишу <Del> (если значение свойства Options.dgConfirmDelete равно false)
Options.dgConfirmDelete
Необходимость подтверждения удаления записи.
Если значение свойства равно true, то чтобы удалить
запись, пользователь должен нажать комбинацию клавиш <Ctrl>+<Del> и подтвердить выполнение операции
удаления щелчком на кнопке OK в появившемся окне
Confirm.
Если значение свойства равно false, то текущая
запись будет удалена в результате нажатия клавиши
<Del>
Options.dgTitles
Разрешает вывод строки заголовка столбцов
Options.dgIndicator
Разрешает (true) отображение колонки индикатора. Во
время работы с базой данных текущая запись помечается в колонке индикатора треугольником, новая
запись — звездочкой, редактируемая — специальным
значком
Options.dgColumnResize
Разрешает (true) менять во время работы программы
ширину колонок таблицы
Options.dgColLines
Разрешает (true) выводить линии, разделяющие колонки таблицы
Options.dgRowLines
Разрешает (true) выводить линии, разделяющие строки таблицы
Свойство Colunns компонента DBGrid представляет собой коллекцию (массив) объектов типа TColumn. Свойства объекта TColumn (табл. 6.8) определяют
информацию, которая отображается в колонке.
Таблица 6.8. Свойства объекта TColumn
Свойство
Описание
FieldName
Поле, содержимое которого отображается в колонке
Width
Ширина колонки в пикселах
237
Глава 6. Базы данных
Таблица 6.8 (окончание)
Свойство
Описание
Font
Шрифт, используемый для отображения текста в ячейках
колонки
Color
Цвет фона
Alignment
Способ выравнивания текста в ячейках колонки. Текст может быть выровнен по левому краю (taLeftJustify), по
центру (taCenter) или по правому краю (taRightJustify)
Title.Caption
Заголовок колонки. По умолчанию в заголовке отображается имя поля
Title.Alignment
Способ выравнивания заголовка. Заголовок может быть
выровнен по левому краю (taLeftJustify), по центру
(taCenter) или по правому краю (taRightJustify)
Title.Color
Цвет фона заголовка колонки
Title.Font
Шрифт заголовка колонки
Настройка компонента DBGrid выполняется следующим образом:
1. Сначала в коллекцию Columns надо добавить столько элементов, сколько
столбцов данных необходимо отобразить в поле компонента DBGrid. Для
этого следует раскрыть окно редактора коллекции — щелкнуть на кнопке
с тремя точками, которая находится в поле значения свойства Columns, или
из контекстного меню, появляющегося в результате щелчка правой кнопкой мыши в поле компонента, выбрать команду Columns Editor.
2. В окне редактора коллекции (рис. 6.9) надо сделать щелчок на кнопке Add
New. В результате в коллекцию Columns будет добавлен новый элемент —
объект TColumns.
Рис. 6.9. Чтобы добавить элемент в коллекцию Columns,
надо сделать щелчок на кнопке Add New
238
Часть II. Практикум программирования
3. Добавив нужное количество элементов в коллекцию Columns, можно приступить к их настройке. В простейшем случае для каждой колонки достаточно установить значение свойств FieldName и Title.Caption.
В табл. 6.9 приведены значения свойств компонента DBGrid1, а на рис. 6.10 —
вид формы после его настройки.
Таблица 6.9. Значения свойств компонента DBGrid1
Свойство
Значение
Font.Name
Tahoma
Font.Size
9
Columns[0].FieldName
Name
Columns[0].TitleCaption
Имя
Columns[0].Title.Width
354
Columns[0].Title.Font.Style
fsBold
Columns[1].FieldName
Phone
Columns[1].TitleCaption
Телефон
Columns[1].Width
116
Columns[1].Title.Font.Style
fsBold
Рис. 6.10. Вид формы после настройки компонента DBGrid
239
Глава 6. Базы данных
Следующее, что надо сделать, — создать процедуры обработки событий
Activate и Close формы (листинг 6.1). Функция обработки события Activate
должна открыть базу данных, функция обработки события Close — сохранить изменения, сделанные пользователем. Здесь нужно обратить внимание
на то, что изменения, сделанные пользователем, автоматически фиксируются
в базе данных в момент перехода к следующей записи. Однако если пользователь, не завершив ввод данных, закроет окно программы, то сделанные изменения не будут записаны в базу данных. Поэтому в момент завершения
работы программа должна проверить, не редактирует ли пользователь запись,
и если редактирует (в этом случае значение свойства EditorMode компонента
DBGrid равно true), то сохранить ее.
Листинг 6.1. База данных Контакты
#include <oleauto.hpp>
// чтобы был доступен класс
// Oleauto::EOleException
// Начало работы программы
void __fastcall TForm1::FormActivate(TObject *Sender)
{
try
{
ADOConnection1->Open();
ADODataSet1->Active = true;
}
catch (Oleauto::EOleException &e) {
MessageDlg("Ошибка доступа к базе данных.\n" + e.Message,
mtError, TMsgDlgButtons()<<mbOK,0);
DBGrid1->Enabled = false;
}
}
// завершение работы программы
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (DBGrid1->EditorMode) // пользователь не завершил редактирование
{
// сохранить редактируемую запись
ADODataSet1->UpdateBatch(arCurrent);
}
}
240
Часть II. Практикум программирования
Выбор информации из базы данных
При работе с базой данных пользователя, как правило, интересует не все ее
содержимое, а некоторая конкретная информация. В простейшем случае найти нужные сведения можно, просмотрев таблицу. Однако такой способ поиска неудобен и малоэффективен.
Выбрать нужную информацию из базы данных можно, направив серверу
SQL-команду SELECT или, если информация уже загружена из базы данных,
активизировав фильтр.
SQL-запрос
Чтобы выбрать из базы данных только нужные записи, надо направить серверу SQL-команду SELECT, указав в качестве параметра критерий отбора записей.
В общем виде SQL-команда SELECT выглядит так:
SELECT СписокПолей FROM Таблица WHERE (Критерий) ORDER BY СписокПолей
Параметр Таблица задает таблицу базы данных, из которой надо выбрать данные. Параметр СписокПолей, указанный после слова SELECT, задает поля, содержимое которых надо получить (если необходимы данные из всех полей,
то вместо списка полей можно указать "звездочку"). Параметр Критерий задает критерий (условие) отбора записей. Параметр СписокПолей, указанный после ORDER BY, задает поля, по содержимому которых будут упорядочены отобранные записи.
Например, команда
SELECT Name, Phone FROM Contacts WHERE Name = 'Культин Н.Б.'
обеспечивает выборку из таблицы Contacts записи, у которой в поле Name
находится текст "Культин Н.Б.".
В критерии запроса (при сравнении строк) вместо конкретного значения
можно указать шаблон. Например, шаблон Ку% обозначает все строки, которые начинаются с Ку, а шаблон %Ку% — все строки, в которых есть подстрока
Ку. При использовании шаблонов вместо оператора = надо использовать оператор LIKE.
Например, запрос
SELECT * FROM Contacts WHERE Name LIKE 'Ку%'
выберет из таблицы Contacts только те записи, в поле Name которых находится текст, начинающийся с Ку. Вместо оператора LIKE можно использовать
оператор CONTAINING (содержит). Например, приведенный ранее запрос,
241
Глава 6. Базы данных
целью которого является вывод списка абонентов, фамилии которых начинаются с Ку, при использовании оператора CONTAINING будет выглядеть так:
SELECT * FROM Contacts WHERE Name CONTAINING 'Ку'
Следующая программа (ее главная форма приведена на рис. 6.11) демонстрирует использование SQL-запроса для поиска информации в базе данных.
Рис. 6.11. Форма программы работы с базой данных
Рассматриваемая программа является многооконным приложением. В главном окне отображается список абонентов (весь или результат поиска). Окно
Найти (рис. 6.12) (оно становится доступным в результате щелчка в главном
окне на соответствующей кнопке) используется для ввода имени абонента,
телефон которого нужно найти в базе данных.
Рис. 6.12. Окно Найти
Главная форма создается автоматически в момент начала работы над новым
проектом. Чтобы создать форму Найти, необходимо в меню File выбрать
команду NewForm – Delphi Win32. После того как форма Запрос будет
настроена (рис. 6.13, табл. 6.10 и 6.11), ее надо сохранить в каталоге проекта — выбрать в меню File команду Save. Здесь следует обратить внимание на
242
Часть II. Практикум программирования
свойство ModalResult кнопки Button1. По умолчанию значение свойства равно mrNone. В данном случае значение свойства ModalResult равно mrOk, поэтому во время работы программы в результате щелчка на кнопке OK окно
будет закрыто, причем функция, которая активизирует процесс отображения
окна, получит информацию о том, щелчком на какой кнопке пользователь
закрыл окно (на кнопке OK или на системной кнопке Закрыть).
Рис. 6.13. Форма Найти
Таблица 6.10. Значения свойств формы Найти
Свойство
Значение
Name
Form2
BorderStyle
bsSingle
BorderIcons.Minimize
false
BorderIcons.Maximize
false
Position
poMainFormCenter
Таблица. 6.11. Значения свойств кнопки OK формы Найти
Свойство
Значение
Enabled
false
ModalResult
mrOk
Завершив настройку главной формы и формы Найти, можно приступить к
созданию процедур обработки событий. Процедуры обработки событий главной формы приведены в листинге 6.2, формы Найти — в листинге 6.3. Следует обратить внимание на то, что в модуль главной формы надо добавить
ссылку на модуль формы Найти — директиву #include "Unit2.h" (Unit2 —
имя модуля формы Найти).
243
Глава 6. Базы данных
Листинг 6.2. Модуль главной формы (Unit1.cpp)
// чтобы форма Найти (Form2) была доступна, в программу
// надо вставить ссылку на файл Unit2.h
#include "Unit2.h"
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
// Начало работы программы
void __fastcall TForm1::FormActivate(TObject *Sender)
{
try
{
ADOConnection1->Open();
ADODataSet1->Active = true;
}
catch (Oleauto::EOleException &e) {
MessageDlg("Ошибка доступа к файлу базы данных.\n" + e.Message,
mtError, TMsgDlgButtons()<<mbOK,0);
}
}
// Щелчок на кнопке Найти
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2->ShowModal();
if ( Form2->ModalResult == mrOk)
{
// пользователь ввел критерий запроса
// и нажал кнопку OK
ADODataSet1->Close();
ADODataSet1->CommandText =
// 042 — код символа "двойная кавычка"
"SELECT * FROM Contacts WHERE Name Like \042%" +
Form2->Edit1->Text + "%\042";
// отладочная печать
ShowMessage(ADODataSet1->CommandText);
}
// показать SQL-команду
244
Часть II. Практикум программирования
ADODataSet1->Open();
if (ADODataSet1->RecordCount == 0)
{
// В базе данных нет записей,
// удовлетворяющих критерию запроса.
ADODataSet1->Filtered = false;
ShowMessage
("В БД нет записей, удовлетворяющих критерию запроса");
}
}
// Щелчок на кнопке Все записи
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ADODataSet1->Close();
ADODataSet1->CommandText =
"SELECT * FROM Contacts ORDER BY Name";
ADODataSet1->Open();
}
// завершение работы программы
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (DBGrid1->EditorMode == true) // пользователь не завершил
// редактирование
{
// сохранить редактируемую запись
ADODataSet1->UpdateBatch(arCurrent);
ADODataSet1->Close();
}
}
Листинг 6.3. Модуль формы Найти (Unit2.cpp)
/*
Это окно отображается как модальный диалог.
Чтобы в результате щелчка на кнопке OK окно закрылось,
и вновь стало доступным главное окно, свойству ModalResult
кнопки Button1 надо присвоить значение mrOK.
*/
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
Глава 6. Базы данных
245
// окно появилось на экране
void __fastcall TForm2::FormActivate(TObject *Sender)
{
Edit1->Clear();
Edit1->SetFocus();
}
// изменилось содержимое поля редактирования
void __fastcall TForm2::Edit1Change(TObject *Sender)
{
if ( Edit1->Text.Length()
> 0 )
Button1->Enabled = true;
else
Button1->Enabled = false;
}
// нажатие клавиши в поле редактирования
void __fastcall TForm2::Edit1KeyPress(TObject *Sender, char &Key)
{
if ( (Key == VK_RETURN) && ( Edit1->Text.Length() > 0))
Button1->SetFocus();
}
Фильтр
Часто нужная пользователю информация уже есть в загруженной таблице.
В этом случае, для того чтобы ее выбрать (скрыть ненужную в данный
момент информацию), можно воспользоваться механизмом фильтрации
записей.
Фильтр — это условие отбора записей. Возможностью фильтрации обладают
компоненты ADODataset, ADOQuery и ADOTable. Для того чтобы фильтрация была выполнена, в свойство Filter надо записать условие отбора записей и активизировать процесс фильтрации — присвоить значение true свойству
Filtered (чтобы отменить действие фильтра, свойству Filtered надо присвоить значение false). Следует обратить внимание на то, что фильтр воздействует на набор данных, сформированный в результате выполнения команды
SELECT. Принципиальное отличие механизма фильтрации от выборки записей
командой SELECT состоит в том, что фильтр воздействует на записи, уже загруженные из базы данных (скрывает записи, не удовлетворяющие критерию
запроса), в то время как команда SELECT загружает из базы данных записи,
удовлетворяющие критерию запроса.
246
Часть II. Практикум программирования
В качестве примера использования фильтра, в листинге 6.4 приведены процедуры обработки событий Click для кнопок Найти и Все записи программы работы с базой данных Контакты.
Листинг 6.4. Обработка событий Click на кнопках Найти и Все записи
// Щелчок на кнопке Найти
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2->ShowModal();
if ( Form2->ModalResult == mrOk)
{
// пользователь ввел критерий запроса
// и нажал кнопку OK
// фильтр
ADODataSet1->Filtered = false;
ADODataSet1->Filter ="name Like %"+
Form2->Edit1->Text + "%";
ADODataSet1->Filtered = true;
if ( ADODataSet1->RecordCount == 0 )
{
// В базе данных нет записей,
// удовлетворяющих критерию запроса.
ADODataSet1->Filtered = false;
ShowMessage
("В БД нет записей, удовлетворяющих критерию запроса");
}
}
}
// Щелчок на кнопке Все записи
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ADODataSet1->Filtered = false;
}
Работа с базой данных в режиме формы
Существуют два режима отображения данных: таблица и форма.
В режиме таблицы в окне программы отображается таблица, что позволяет
видеть несколько записей одновременно. Обычно этот режим используется
247
Глава 6. Базы данных
для просмотра записей. Отображение данных в режиме таблицы обеспечивает компонент DBGrid. Если в таблице, содержимое которой отображается в
поле компонента DBGrid, много колонок, то пользователь, как правило, не
может видеть все столбцы одновременно, и для того чтобы увидеть нужную
информацию, он вынужден менять ширину столбцов или прокручивать содержимое поля компонента по горизонтали, что не совсем удобно.
В режиме формы в окне программы отображается только одна запись, что
позволяет одновременно видеть содержимое всех полей записи. Обычно режим формы используется для ввода информации в базу данных, а также для
просмотра записей, состоящих из большого количества полей. Часто режим
формы и режим таблицы комбинируют.
Компоненты, обеспечивающие просмотр и редактирование полей, находятся
на вкладке Data Controls (рис. 6.14). На практике наиболее часто используются компоненты DBEdit и DBMemo. Они являются аналогами компонентов
Edit и Мемо и ориентированы на работу с базами данных. Свойства компонентов DBEdit и DBMemo, обеспечивающие работу с базой данных, приведены в
табл. 6.12.
Рис. 6.14. Компоненты DBEdit и DBMemo обеспечивают редактирование полей записей
базы данных, компонет DBNavigator — навигацию по БД
Таблица 6.12. Свойства компонентов DBEdit и DBMemo
Свойство
Описание
DataSource
Источник данных
DataField
Поле записи базы данных, содержимое которого отображается в поле компонента
В качестве примера рассмотрим программу (ее форма приведена на
рис. 6.15), которая обеспечивает работу с базой Контакты, но уже в режиме
формы.
Компоненты DBEdit и DBMemo обеспечивают отображение полей текущей
записи, компонент Image — отображение иллюстрации, имя файла которой
находится в поле image. Соединение с базой данных обеспечивает компонент ADOConnection, а доступ к данным, находящимся в таблице Contacts, —
248
Часть II. Практикум программирования
компонент ADODataSet. Значения свойств этих компонентов приведены в
табл. 6.13.
Рис. 6.15. Форма программы работы с базой данных Контакты (режим формы)
Таблица 6.13. Значения свойств компонентов
Компонент
Свойство
Значение
ADOConnection1
ConnectionString Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=D:\Database\contacts.mdb;
Persist Security Info=false
LoginPrompt
false
Connection
ADOConnection1
CommandText
SELECT * FROM contacts
DataSource1
DataSet
ADOTable1
DBEdit1
DataSource
DataSource1
DataField
Name
AutoSelect
false
ReadOnly
true
DataSource
DataSource1
DataField
Phone
AutoSelect
false
ReadOnly
true
ADODataSet1
DBEdit2
249
Глава 6. Базы данных
Таблица 6.13 (окончание)
Компонент
Свойство
Значение
DBMemo
DataSource
DataSource1
DataField
Comment
Proportional
true
Enabled
false
Hint
Щелкните, чтобы изменить
ShowHint
true
Image1
Компонент DBNavigator (его свойства приведены в табл. 6.14) обеспечивает
перемещение указателя текущей записи к следующей, предыдущей, первой
или последней записи, а также выполнение других операций, которые выполняются в результате щелчка на соответствующей кнопке (табл. 6.15). Следует
обратить внимание на свойство VisibleButtons. Оно позволяет скрыть некоторые кнопки компонента DBNavigator и тем самым запретить выполнение
соответствующих операций над файлом данных. Например, присвоив значение false свойству VisibleButtons.nbDelete, можно скрыть кнопку nbDelete
и тем самым запретить удаление записей.
Значения свойств компонента DBNavigator1 приведены в табл. 6.16.
Таблица 6.14. Свойства компонента DBNavigator
Свойство
Определяет
DataSource
Источник данных. В качестве источника данных может выступать, например, компонент ADODataSet, ADOTable или
ADOQuery
VisibleButtons
Кнопки, которые отображаются в поле компонента. Скрыв
некоторые кнопки, можно запретить выполнение соответствующих действий
Таблица 6.15. Кнопки компонента DBNavigator
Кнопка
Обозначение
Действие
К первой
nbFirst
Указатель текущей записи перемещается к первой записи файла данных
К предыдущей
nbPrior
Указатель текущей записи
перемещается к предыдущей записи
файла данных
250
Часть II. Практикум программирования
Таблица 6.15 (окончание)
Кнопка
Обозначение
Действие
К следующей
nbNext
Указатель текущей записи перемещается к следующей записи файла данных
К последней
nbLast
Указатель текущей записи перемещается к последней записи файла данных
Добавить
nbInsert
В файл данных добавляется новая
запись
Удалить
nbDelete
Удаляется текущая запись файла данных
Редактирование
nbEdit
Устанавливает режим редактирования
текущей записи
Сохранить
nbPost
Изменения, внесенные в текущую
запись, записываются в файл данных
Отменить
Cancel
Отменяет внесенные в текущую запись
изменения
Обновить
nbRefresh
Записывает внесенные изменения
в файл
Таблица 6.16. Значения свойств компонента DBNavigator1
Свойство
Значение
DataSource
DataSource1
VisibleButtons.bnRefresh
false
ShowHint
true
Hints
Первая запись
Предыдущая запись
Следующая запись
Последняя запись
Добавить запись
Удалить запись
Редактировать запись
Сохранить изменения
Отменить изменения
Текст программы приведен в листинге 6.5.
Глава 6. Базы данных
251
Функция обработки события AfterScroll (оно возникает после того, как в результате нажатия кнопки компонента DBNavigator указатель текущей записи
будет перемещен к следующей или предыдущей записи) компонента
DBNavigator инициирует процесс отображения иллюстрации.
Непосредственное отображение иллюстрации обеспечивает функция
ShowImage, которой в качестве параметра передается содержимое поля Image
(или пустая строка, если поле пустое). Она выводит иллюстрацию или (если
поле Image текущей записи пустое) картинку nobody.jpg.
Функция обработки события Click компонента Image1 обеспечивает ввод
информации в поле Image (обратите внимание: в окне программы отображается иллюстрация, а не содержимое поля Image). Она открывает диалог Выбор иллюстрации (компонент OpenDialog), в котором пользователь может
выбрать картинку. Если иллюстрация выбрана, то имя файла иллюстрации
записывается в поле Image текущей записи БД, а сам файл копируется в каталог Images.
Листинг 6.5. Программа работы с базой данных Контакты (режим формы)
// Начало работы программы
void __fastcall TForm1::FormActivate(TObject *Sender)
{
try {
ADOConnection1->Open();
ADODataSet1->Open();
StatusBar1->Panels->Items[0]->Text = "Запись: 1";
}
catch (Exception &e)
{
DBEdit1->Enabled = false;
DBEdit2->Enabled = false;
DBNavigator1->Enabled = false;
MessageDlg("" +
aPath + "contacts.mdb",mtError,TMsgDlgButtons()<<mbOK,0);
}
}
// отображает иллюстрацию
void __fastcall TForm1::ShowImage(AnsiString img)
{
if ( img == "")
img = "nobody.jpg";
252
Часть II. Практикум программирования
try
{
Image1->Picture->LoadFromFile(aPath+"images\\"+img);
}
catch (Exception &e){}
}
// переход к следующей записи
void __fastcall TForm1::ADODataSet1AfterScroll(TDataSet *DataSet)
{
AnsiString img;
if ( ADODataSet1->RecNo != -1 )
{
StatusBar1->Panels->Items[0]->Text =
" Запись: " + IntToStr(ADODataSet1->RecNo);
StatusBar1->Panels->Items[1]->Text = "";
// если поле image не содержит данных,
// то возникает исключение
try
{
img = ADODataSet1->FieldValues["image"];
}
catch (Exception &e)
{
img = "";
}
ShowImage(img);
}
else
StatusBar1->Panels->Items[0]->Text = " Новая запись" ;
}
// щелчок на кнопке компонента DBNavigator
void __fastcall TForm1::DBNavigator1Click(TObject *Sender, TNavigateBtn
Button)
{
switch ( Button )
{
case nbInsert:
StatusBar1->Panels->Items[0]->Text = "Новая запись";
Глава 6. Базы данных
DBEdit1->ReadOnly = false;
DBEdit2->ReadOnly = false;
DBMemo1->ReadOnly = false;
ShowImage("nobody.jpg");
Image1->Enabled = true;
break;
case nbEdit:
StatusBar1->Panels->Items[1]->Text = "Редактирование";
DBEdit1->ReadOnly = false;
DBEdit2->ReadOnly = false;
DBMemo1->ReadOnly = false;
Image1->Enabled = true;
break;
case
case
case
case
case
case
nbFirst:
nbPrior:
nbNext:
nbLast:
nbPost:
nbCancel:
DBEdit1->ReadOnly = true;
DBEdit2->ReadOnly = true;
DBMemo1->ReadOnly = true;
Image1->Enabled = false;
StatusBar1->Panels->Items[1]->Text ="";
break;
case nbDelete: break;
}
}
// щелчок на иллюстрации
void __fastcall TForm1::Image1Click(TObject *Sender)
{
AnsiString nFileName;
OpenDialog1->FileName = "*.jpg";
if ( OpenDialog1->Execute() )
{
// пользователь выбрал изображение
nFileName = ExtractFileName(OpenDialog1->FileName);
nFileName = aPath + "images\\" + nFileName;
253
254
Часть II. Практикум программирования
// скопировать изображение в каталог Image
CopyFile( OpenDialog1->FileName.c_str(), nFileName.c_str(), false);
ShowImage(nFileName);
ADODataSet1->FieldValues["image"] = nFileName;
}
}
// завершение работы программы
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if ( ADODataSet1->State == dsEdit)
// пользователь не завершил редактирование
// записать редактируемую запись в БД
ADODataSet1->UpdateBatch(arCurrent);
ADODataSet1->Close();
}
Загрузка строки соединения из ini-файла
Рассмотренные программы работы с базой данных Контакты для соединения с
источником данных используют компонент ADOConnection, свойство
ConnectionString которого жестко задает имя и путь к файлу базы данных.
Поэтому при установке программы работы с базой данных на другой компьютер необходимо, чтобы каталог базы данных находился на том же диске,
что и на компьютере программиста, что не всегда удобно, а иногда и не выполнимо. Избежать подобных проблем можно, если строку соединения загружать из ini-файла в начале работы программы. Задачу загрузки или формирования строки соединения с учетом реального размещения базы данных
можно возложить на функцию обработки события BeforeConnect компонента
ADOConnection, которое происходит непосредственно перед подключением к
базе данных. Приведенная в листинге 6.6 функция показывает, как это можно
сделать. В данном примере из ini-файла (листинг 6.7) загружается не строка
соединения, а только имя каталога базы данных, после чего строка соединения формируется путем замены фрагмента.
Листинг 6.6. Обработка события BeforeConnection
void __fastcall TForm1::ADOConnection1BeforeConnect(TObject *Sender)
{
int p1,p2;
TIniFile* iniFile;
AnsiString fn;
// имя ini-файла
AnsiString st;
// строка соединения
Глава 6. Базы данных
255
// ini-файл находится в том же каталоге, что и exe-файл,
// его имя совпадает с именем exe-файла, но расширение — ini
fn = ReplaceStr(Application->ExeName,".exe",".ini");
iniFile = new TIniFile(fn);
// прочитаем из ini-файла имя каталога,
// в котором находится БД
// ключ aPath находится в секции data
aPath = iniFile->ReadString("data","aPath","");
if ( aPath == "" )
MessageDlg("Ошибка чтения ключа aPath из файла " +
iniFile->FileName ,mtError, TMsgDlgButtons()<<mbOK,0);
else {
st = ADOConnection1->ConnectionString;
p1 = Pos("Data Source",st)-1;
p2 = PosEx(";",st,p1)-1;
st = LeftStr(st,p1) + "Data Source="+ aPath+ "contacts.mdb" +
RightStr(st, st.Length()-p2);
ADOConnection1->ConnectionString = st;
}
}
Листинг 6.7. Ini-файл
[data]
aPath=D:\Database\
Сервер InterBase
Сервер Borland InterBase 2007 является хорошей основой для построения информационных систем различного масштаба и назначения. Отличительной
особенностью сервера является высокая скорость работы, надежность, несложный процесс развертывания и администрирования. Сервер может работать на платформах Microsoft Windows (Microsoft Windows Vista, Microsoft
Windows Server 2003, Microsoft Windows XP, Microsoft Windows 2000), Linux
и Solaris.
Borland предоставляет пользователям несколько версий сервера InterBase 2007:
ˆ InterBase Server Edition 2007;
ˆ InterBase Server Edition 2007 Dual Core;
256
Часть II. Практикум программирования
ˆ InterBase Desktop Edition 2007;
ˆ InterBase Developer Edition 2007.
Первые из трех перечисленных вариантов являются полнофункциональными
серверами. Сервер Dual Core оптимизирован для работы на компьютере с
двухъядерным процессором. Вариант Desktop представляет собой локальный
сервер баз данных. Версия Developer Edition предназначена для разработчиков программного обеспечения.
Установка
Установить Developer Edition версию сервера InterBase на компьютер разработчика или на другой, доступный по сети компьютер, можно с диска RAD
Studio, выбрав соответствующую команду в окне активизации процесса установки компонентов RAD Studio, или путем запуска программы ib_install (она
находится в каталоге InterBase установочного диска).
Во время установки программист может выбрать устанавливаемые компоненты (рис. 6.16). По умолчанию на компьютер разработчика устанавливается сервер InterBase, клиент (библиотека gds32.dll, обеспечивающая соединение с сервером), документация, утилиты IBConsole, InterBase Server Manager,
isql, gsec и др.
Рис. 6.16. Начало установки InterBase
Процесс установки завершается регистрацией (если в окне выбора устанавливаемых компонентов был установлен флажок Register), которая по умол-
Глава 6. Базы данных
257
чанию выполняется в режиме on-line (компьютер, на который устанавливается сервер, должен иметь доступ к Интернету). После ввода в окне регистрации серийного номера продукта и ключа с Web-сервера Borland на компьютер передается файл активации.
Установка Developer-версии не предполагает наличие у разработчика серийного номера и ключа продукта. Поэтому в окне выбора компонентов надо сбросить флажок Register.
Хотя, как было сказано ранее, версия Developer не предполагает наличие у
разработчика серийного номера и ключа продукта, но тем не менее и она требует активации. Файл активации для версии developer (trial) можно получить,
зарегистрировавшись в CodeGear Developer Network.
Для этого следует на сайте CodeGear (www.codegear.com) раскрыть страницу Downloads и выбрать ссылку InterBase. Затем на странице InterBase Trial
and Free Versions необходимо выбрать продукт, для которого нужен активационный файл, и заполнить регистрационную форму. В результате на e-mailадрес, указанный во время регистрации, придет письмо с прикрепленным регистрационным файлом (reg*.txt). Этот файл нужно поместить в подкаталог
License того каталога, в который установлен InterBase (по умолчанию это
C:\Borland\InterBase).
Запуск
Чтобы запустить InterBase, надо в меню Все программы Borland выбрать
команду InterBase Server Manager и в появившемся окне сделать щелчок на
Рис. 6.17. Чтобы запустить InterBase, надо сделать щелчок на кнопке Start
258
Часть II. Практикум программирования
кнопке Start (рис. 6.17). Следует обратить внимание: если во время запуска
будет указан режим автоматического старта (выбран переключатель Startup
Mode Automatic), то при следующем включении компьютера сервер будет
запущен автоматически.
Утилита IBConsole
В комплект поставки InterBase входит утилита IBConsole, которая позволяет
решать задачи администрирования сервера. С ее помощью можно, например,
открыть доступ к существующей базе данных, создать новую базу данных,
зарегистрировать пользователя и определить его полномочия.
Чтобы запустить IBConsole (рис. 6.18), надо в меню Программы выбрать
команду InterBaseIBConsole.
Рис. 6.18. Утилита IBConsole используется для администрирования сервера InterBase
Регистрация сервера
Для того чтобы подключиться к серверу, надо в меню Server выбрать команду Add и в поля появившегося окна Add Server and Connect ввести информацию о сервере.
Если InterBase работает на другом, доступном по сети, компьютере, то надо
выбрать Remote Server (удаленный), в поле Server Name ввести сетевое имя
Глава 6. Базы данных
259
компьютера, на котором установлен InterBase, а в поле Alias Name — имя,
которое предполагается использовать для доступа к серверу InterBase
(рис. 6.19).
Рис. 6.19. Настройка соединения с удаленным сервером
Следует обратить внимание: имя и IP-адрес компьютера, на котором работает
InterBase, должны быть прописаны в файле C:\Windows\System32\drivers
\etc\hosts компьютера-клиента (листинг 6.8). Узнать IP-адрес сервера можно,
запустив на нем системную утилиту ipconfig.exe.
Листинг 6.8. Файл hosts (фрагмент)
127.0.0.1
192.168.1.5
localhost
nk
Если сервер работает на том же компьютере, на котором запущена консоль,
то в поле Server Name следует ввести localhost (обратите внимание, имя
localhost есть в файле hosts).
После того как будет введена информация о сервере, надо установить флажок
Register Only и сделать щелчок на ставшей доступной кнопке OK. В результате в списке InterBase Servers окна IBConsole появится имя сервера.
260
Часть II. Практикум программирования
Подключение к серверу
Для того чтобы получить доступ (подключиться) к серверу, надо сделать
двойной щелчок на значке сервера и в появившемся окне (рис. 6.20) ввести
имя (User Name) и пароль (Password) пользователя, запрашивающего подключение.
Рис. 6.20. После установки InterBase доступ к серверу имеет
только администратор — пользователь SYSDBA (пароль — masterkey)
Следует обратить внимание на то, что сразу после установки InterBase доступ
к серверу имеет только администратор — пользователь SYSDBA (пароль —
masterkey). Для того чтобы доступ к серверу был и у других пользователей,
администратор должен их зарегистрировать, затем определить полномочия
(указать базы данных, с которыми пользователь может работать, и операции,
которые он может выполнять над данными).
При подключении к удаленному серверу необходимо учитывать, что доступ к
серверу может быть ограничен брандмауэром. Для того чтобы клиент мог
Рис. 6.21. Чтобы клиент мог подключиться к серверу InterBase с другого компьютера,
надо открыть порт 3050
261
Глава 6. Базы данных
подключиться к серверу InterBase, на сервере должен быть открыть порт
3050. Чтобы открыть порт, надо через Центр обеспечения безопасности сначала открыть брандмауэр, на вкладке Исключения сделать щелчок на кнопке
Добавить порт и в появившемся окне задать имя и номер порта (рис. 6.21).
Регистрация пользователя
Как было сказано ранее, после установки InterBase доступ к серверу есть
только у администратора (пользователя SYSDBA). Чтобы и у других пользователей был доступ к серверу, администратор должен их зарегистрировать.
Чтобы зарегистрировать пользователя, администратор должен подключиться
к серверу, в контекстном меню элемента Users выбрать команду Add User
(рис. 6.22) и в поля появившегося окна User Information (рис. 6.23) ввести
информацию о новом пользователе: имя и пароль.
Рис. 6.22. Регистрация пользователя (шаг 1)
Регистрация существующей базы данных
Если файл базы данных существует, но имя базы данных в списке Databases
не отображается, то для того чтобы получить доступ к базе данных, надо в
меню Database выбрать команду Add, в появившемся окне (рис. 6.24) указать
файл базы данных и задать псевдоним. Если в этом же окне указать информацию, необходимую для подключения к базе данных (User Name и
Password), то база данных будет не только зарегистрирована, но и открыта.
262
Часть II. Практикум программирования
Рис. 6.23. Регистрация пользователя (шаг2)
Рис. 6.24. Чтобы база данных стала доступна, ее надо зарегистрировать
Соединение с БД
Если база данных зарегистрирована (ее имя отображается в списке баз данных сервера), то для того чтобы получить к ней доступ (открыть соединение с
базой данных), надо выбрать базу данных (сделать щелчок на значке, ее изо-
Глава 6. Базы данных
263
бражающем), в меню Database выбрать команду Connect, а затем в появившемся окне ввести имя и пароль пользователя, запрашивающего доступ к базе
данных.
Создание базы данных
База данных (БД) — это совокупность таблиц, индексов, запросов и хранимых процедур. В InterBase все элементы, образующие базу данных, хранятся
в одном файле.
Чтобы создать базу данных, надо в меню Database выбрать команду Create
Database и в появившемся окне Create Database (рис. 6.25) задать имя файла
базы данных (c расширением ib) и псевдоним.
Имя файла базы данных можно задать, указав каталог, в который надо поместить файл базы данных. Если каталог не указан, то этот файл будет создан в
каталоге InterBase (если база создается на удаленном сервере) или в каталоге
C:\Documents and Settings\User, где User — имя пользователя (если сервер
зарегистрирован как локальный).
Рис. 6.25. Чтобы создать базу данных, надо указать файл и псевдоним базы данных
264
Часть II. Практикум программирования
Псевдоним (имя, которое используется для доступа к базе данных) надо ввести в поле Alias. Использование псевдонима вместо имени файла позволяет
серверу скрыть от пользователя имя файла базы данных, а также его физическое размещение на диске компьютера. Следует обратить внимание на флажок Register database. Если он установлен (а по умолчанию это так), то созданная в результате щелчка на кнопке OK база данных будет зарегистрирована и станет доступной через IBConsole.
Пользователь, создавший базу данных, является ее владельцем. Он по отношению к этой базе данных, обладая неограниченными полномочиями, может
создавать таблицы, наполнять их информацией, открывать базу данных для
других пользователей и определять их полномочия. Следует обратить внимание на то, что доступ к только что созданной базе данных есть только у хозяина (пользователя, который ее создал) и у администратора.
Создание таблицы
Чтобы создать в базе данных таблицу, надо направить серверу SQL-команду
CREATE TABLE.
Например, команда
CREATE TABLE Books (Title CHAR(60) NOT NULL, Author CHAR(30))
обеспечивает создание таблицы Books в текущей базе данных.
Рис. 6.26. Чтобы создать таблицу, надо набрать SQL-запрос
и активизировать процесс его выполнения (команда QueryExecute)
Глава 6. Базы данных
265
SQL-команды надо набирать в верхней части окна Interactive SQL
(рис. 6.26), которое становится доступным в результате выбора в меню Tools
команды Interactive SQL. После того как команда будет набрана, следует
активизировать процесс ее выполнения — выбрать в меню Query команду
Execute.
Ввод данных в таблицу
Чтобы ввести информацию в таблицу, надо направить серверу команду
INSERT INTO, указав в качестве параметров таблицу и данные.
Например, команда
INSERT INTO Books (Title, Author)
VALUES ('C++ Builder в примерах и задачах','Культин Н.Б.')
добавляет информацию (строку) в таблицу Books.
Данные в таблицу можно ввести также в режиме редактирования таблицы
(рис. 6.27). Для перехода в этот режим надо выбрать базу данных, раскрыть
список таблиц, сделать двойной щелчок на значке нужной таблицы и в появившемся окне открыть вкладку Data.
Рис. 6.27. Ввод данных осуществляется на вкладке Data
Данные в таблицу вводят обычным образом. Для перехода к следующему полю (столбцу таблицы) нужно нажать клавишу <Tab>. Если текущее поле яв-
266
Часть II. Практикум программирования
ляется последним полем последней строки (записи), то в результате нажатия
клавиши <Tab> в таблицу будет добавлена строка (запись).
Если во время заполнения таблицы необходимо внести изменения в уже заполненное поле, то надо, используя клавиши перемещения курсора, выбрать
это поле и нажать клавишу <F2>.
В нижней части окна находятся кнопки, обеспечивающие навигацию по базе
данных, и кнопки управления редактированием (табл. 6.17).
Таблица 6.17. Кнопки навигации и управления редактированием БД
Кнопка
Действие
К первой
Указатель текущей записи перемещается к первой
записи файла данных
К предыдущей
Указатель текущей записи перемещается
к предыдущей записи файла данных
К следующей
Указатель текущей записи перемещается к следующей
записи файла данных
К последней
Указатель текущей записи перемещается к последней
записи файла данных
Добавить
Добавляет в таблицу перед текущей строкой пустую
строку
Удалить
Удаляет текущую строку таблицы
Редактирование
Активизирует режим редактирования текущей строки
Сохранить
Изменения, внесенные в текущую строку, записываются в базу (файл) данных
Отменить
Отменяет внесенные в текущую строку (запись)
изменения
Обновить
Записывает в файл изменения, внесенные в таблицу,
или считывает данные из файла и обновляет таблицу
Удаление таблицы
Иногда возникает необходимость удалить таблицу из базы данных. Чтобы это
сделать, надо раскрыть список таблиц, сделать щелчок на значке таблицы,
которую надо удалить, и в контекстном меню выбрать команду Drop.
Управление доступом к базе данных
Иногда возникает необходимость закрыть базу данных, сделать ее недоступной из IBConsole. Чтобы это сделать, надо в меню Database выбрать команду
267
Глава 6. Базы данных
Remove. Если соединение с базой данных открыто (в этом случае команда
Remove будет недоступна), то его надо предварительно закрыть — выбрать в
меню Database команду Disconnect. В результате описанных действий база
данных станет недоступной, а ее имя будет удалено из списка доступных (зарегистрированных) баз данных. Здесь следует обратить внимание, что команда Remove не уничтожает файл базы данных, а только делает базу данных
недоступной.
Утилиты gsec и isql
В комплект поставки InterBase входят работающие в режиме командной строки утилиты: gsec и isql. Утилита gsec позволяет выполнить настройку сервера, isql — направить серверу SQL-команду и увидеть результат ее выполнения. Обе утилиты (gsec.exe и isql.exe) находятся в каталоге InterBase\Bin.
Чтобы запустить утилиту gcec, сначала надо открыть окно командной строки
(ПускВсе программыСтандартныеКомандная строка) и сделать
текущим каталог C:\Borland\InterBase\Bin (набрать в окне командной строки
C:\Borland\InterBase\Bin и нажать клавишу <Enter>). Затем надо набрать
команду, обеспечивающую запуск утилиты gseс (рис. 6.28), указав в качестве
параметров свое имя (ключ -user) и пароль (ключ -password). Сделать это может администратор или другой пользователь, имеющий доступ к серверу и
обладающий соответствующими полномочиями. Следует обратить внимание
на то, что если InterBase работает на удаленном компьютере, то в инструкции
запуска надо указать ключ –database и полное (т. е. с указанием имени сервера и службы) имя файла системной базы данных (admin.ib).
Рис. 6.28. Запуск утилиты gsec
268
Часть II. Практикум программирования
Утилита gsec работает в режиме командной строки. Набранная команда, если
она правильная, выполняется в результате нажатия клавиши <Enter>.
Некоторые команды утилиты gsec приведены в табл. 6.18.
Таблица 6.18. Команды утилиты gsec
Команда
Действие
display
Выводит список пользователей, зарегистрированных
на сервере
add имя -pw пароль
Регистрирует пользователя
modify имя –pw пароль
Задает новый пароль для указанного пользователя
delete имя
Закрывает пользователю, имя которого указано в качестве параметра команды, доступ к серверу
alias_add псевдоним
–alias_dbpath файл_БД
Регистрирует псевдоним. После того как псевдоним
будет зарегистрирован, вместо имени файла базы
данных можно использовать псевдоним
alias_dis
Выводит список зарегистрированных псевдонимов
help
Выводит краткую справку (список команд)
quit
Завершение работы с утилитой
Утилита isql позволяет соединиться с сервером и направить ему SQLкоманду. Чтобы запустить утилиту, надо открыть окно командной строки,
сделать текущим каталог C:\Borland\InterBase\Bin, набрать isql и нажать клавишу <Enter>.
Соединение с базой данных обеспечивает команда CONNECT, которая в общем
виде выглядит так:
CONNECT БазаДанных USER Пользователь PASSWORD Пароль
Параметр БазаДанных, в качестве которого можно указать имя файла или
псевдоним базы данных, определяет базу данных, с которой надо установить
соединение. В общем случае перед именем файла или псевдонимом базы
данных надо указать сервер (сетевое имя компьютера, на котором работает
InterBase) и сервис (gds_db).
Параметры Пользователь и Пароль идентифицируют пользователя, запрашивающего подключение (предполагается, что у пользователя есть право доступа к серверу).
Например, если у пользователя NIKITA есть доступ к серверу nk, то для того
чтобы соединиться с базой данных books (здесь books — псевдоним), он должен набрать команду:
CONNECT nk/gds_db:books USER NIKITA PASSWORD nikita;
Глава 6. Базы данных
269
Чтобы SQL-команда, набранная в окне утилиты isql, была выполнена (отправлена серверу), надо после последнего символа команды ввести точку с запятой
и нажать клавишу <Enter>.
После того как соединение c базой данных будет установлено, пользователь
может направить серверу SQL-команду. Например, следующая команда
обеспечивает отображение таблицы books
SELECT * FROM BOOKS;
Чтобы завершить работу с утилитой isql, надо набрать команду quit.
Защита данных
Защита от несанкционированного доступа к данным с целью их просмотра
или изменения является важной проблемой. В InterBase реализована двухуровневая система контроля прав доступа к данным. На первом уровне контролируется право доступа к серверу, в момент подключения пользователь
должен указать Login и пароль. Подключение к серверу не означает получения доступа к данным, находящимся на сервере. Для того чтобы пользователь, подключившийся к серверу, мог получить доступ к базе данных, владелец базы данных должен открыть пользователю доступ, указав, какие операции и над какими объектами базы данных он может выполнять.
Администратор
Администратор (пользователь SYSDBA) обладает особыми полномочиями.
Только он может регистрировать новых пользователей и изменять информацию о существующих.
После установки InterBase пароль администратора — masterkey. Так как это
известно всем, то сразу после установки сервера рекомендуется изменить пароль администратора. Сделать это можно при помощи утилиты gsec, направив серверу команду
modify sysdba –pw пароль
где пароль — новый пароль администратора.
Псевдоним базы данных
Чтобы получить доступ к базе данных, клиент (программа работы с базой
данных) должен знать, где (на каком диске и в каком каталоге) на сервере
находится файл базы данных. Вместе с тем, предоставлять эту информацию
пользователю крайне нежелательно. Разрешить эту проблему можно, создав
на сервере псевдоним базы данных. После того как псевдоним будет создан,
клиент может его использовать вместо имени файла базы данных.
270
Часть II. Практикум программирования
Создать псевдоним может администратор, набрав в окне утилиты gsec
команду alais_add. Например, команда создания псевдонима books для базы
данных Книги (books.ib) выглядит так:
alias_add books -alias_bdpath D:\Database\books.ib
Полномочия пользователя
По умолчанию доступ к базе данных есть только у ее владельца (пользователя, который ее создал) и администратора (SYSDBA). Для того чтобы другие
пользователи могли работать с базой данных, владелец базы должен ее для
них открыть. Сервер InterBase предоставляет широкие возможности по
управлению доступом к базе данных. В частности, разным пользователям
можно предоставить разные права (привилегии) доступа. Например, одному
пользователю можно разрешить только просматривать таблицы, причем не
все, а только некоторые, другому — вносить изменения (всего есть четыре
операции: просмотр, добавление, удаление и изменение).
Чтобы определить полномочия пользователя, надо направить серверу команду GRANT, указав в качестве параметров имя пользователя, объект и список
операций, которые пользователь может выполнять над указанными объектами.
Например, команда
GRANT SELECT ON BOOKS TO guest
открывает пользователю guest таблицу BOOKS, но только для просмотра.
Если надо открыть доступ к базе данных нескольким пользователям, то вместо того чтобы определять полномочия каждого из них, можно определить
роль, а затем назначить этим пользователям соответствующую роль.
Сначала надо создать роль — направить серверу команду CREATE ROLE. После
того как роль будет создана, нужно определить полномочия роли. Назначение
роли выполняет команда GRANT.
Например, последовательность команд
CREATE ROLE operator
GRANT SELECT, APPEND, UPDATE ON Books TO operator
GRANT Platon, Danila TO operator
создает роль operator, определяет ее полномочия (просмотр, добавление и
редактирование записей таблицы BOOKS) и добавляет в созданную группу
пользователей Danila и Platon.
Следует обратить внимание на то, что в каждой базе данных определена роль
PUBLIC (но полномочия ее по умолчанию не определены). Эта роль используется для определения полномочий обычных пользователей. Например, чтобы
Глава 6. Базы данных
271
разрешить пользователю guest (это имя обычно используется для анонимного, не требующего аутентификации пользователя, подключения к серверу)
просматривать таблицу Books, достаточно направить серверу следующие
команды:
GRANT SELECT ON Books TO PUBLIC
GRANT guest TO PUBLUC
Сценарии
Последовательность SQL-команд, обеспечивающая выполнение некоторой
задачи, например создание таблицы и наполнение ее информацией, называется сценарием.
Сценарий можно записать в файл, а затем активизировать процесс его выполнения в автоматическом режиме.
В качестве примера в листинге 6.9 приведен сценарий, обеспечивающий создание базы данных Книги (books.ib).
Листинг 6.9. Сценарий создания базы данных Книги (books_crdb.sql)
CREATE DATABASE 'D:\Database\books.ib'
USER 'sysdba' PASSWORD 'masterkey';
CONNECT 'D:\Database\books.ib' USER 'sysdba' PASSWORD 'masterkey';
CREATE TABLE Books (Title VARCHAR(60) NOT NULL, Author VARCHAR(30));
INSERT INTO Books (Title,Author)
VALUES ('Delphi в примерах и задачах', 'Культин Н.Б.');
INSERT INTO Books (Title,Author)
VALUES ('C++ Builder в примерах и задачах', 'Культин Н.Б.');
GRANT SELECT ON Books TO PUBLIC;
COMMIT;
Чтобы сценарий был выполнен, в окне командной строки надо набрать
команду запуска утилиты isql, указав в качестве значения параметра input файл
сценария. Например, команда запуска сценария books_crdb.sql выглядит так:
isql.exe –input boos_crdb.sql
Приложение работы с базой данных InterBase
Процесс создания приложения работы с базой данных InterBase рассмотрим
на примере. Создадим программу, обеспечивающую работу с базой данных
Книги.
272
Часть II. Практикум программирования
Перед тем как приступить к непосредственной работе в C++ Builder, надо
создать базу данных Книги (books.ib), поместить в нее таблицу Books
(табл. 6.19), наполнить таблицу информацией и определить полномочия роли
PUBLIC (чтение данных из таблицы Books). Также надо на сервере создать
псевдоним books (указать, где находится файл базы данных) и зарегистрировать пользователя guest (пароль guest).
Таблица 6.19. Поля тaблицы Books
Поле
Тип
Title
VARCHAR(60)
Author
VARCHAR(30)
Компоненты, обеспечивающие работу с базами данных InterBase, находятся
на вкладках InterBase, InterBase Admin и dbExpress.
На вкладке InterBase (рис. 6.29) сгруппированы компоненты, позволяющие
соединиться с базой данных (IBDatabase), прочитать из нее информацию
(IBDataSet), направить серверу SQL-запрос (IBQuery)
Рис. 6.29. Компоненты InterBase
Компоненты вкладки InterBase Admin обеспечивают решение задач администрирования сервера InterBase.
На вкладке IBExpress находятся компоненты, использующие для доступа к
данным разработанную Borland технологию dbExpress. Следует обратить
внимание на то, что компоненты dbExpress обеспечивают только однонаправленный (unidirectional) доступ к базе данных. Это значит, что курсор текущей записи можно переместить только к следующей записи. Поэтому для
просмотра базы данных, доступ к которой обеспечивают компоненты
dbExpress, нельзя напрямую использовать компонент DBGrid (при попытке
переместить указатель к предыдущей записи возникает ошибка).
Форма программы работы с базой данных Книги приведена на рис. 6.30, значения свойств компонентов — в табл. 6.20. Необходимо обратить внимание,
что настраивать компоненты и устанавливать значения свойств следует в том
порядке, в котором они перечислены в тaблице.
273
Глава 6. Базы данных
Рис. 6.30. Форма программы работы с базой данных Книги
Таблица 6.20. Значения свойств компонентов
Компонент
Свойство
Значение
IBDatabase1
DatabaseName
localhost/gds_db:books
LoginPrompt
true
Params
user_name=guest
Database
IBDatabase1
Transaction
IBTransaction1
SelectSQL
SELECT * FROM Books WHERE
UPPER(Title) CONTAINING UPPER(
:Title)
ORDER BY Author
InsertSQL
INSERT INTO Books
(Author, Title)
values
(:Author, :Title)
DeleteSQL
DELETE FROM Books
IBDataSet1
WHERE
Author = :OLD_Author AND
Title = :OLD_Title
274
Часть II. Практикум программирования
Таблица 6.20 (окончание)
Компонент
Свойство
Значение
ModifySQL
UPDATE Books
SET
Author = :Author,
TITLE = :Title
WHERE
Author = :OLD_Author AND
Title = :OLD_Title
RefreshSQL
SELECT
Author,
Title
FROM Books
WHERE
Author = :Author AND
Title = :Title
IBTransaction1 DefaultDatabase
IBDatabase1
DataSource1
DataSet
IBDataSet1
DBGrid1
DataSource
DataSet1
Font.Name
Tahoma
Font.Size
9
Columns[0].FieldName
Author
Columns[0].Title.Caption
Автор
Columns[1].FieldName
Title
Columns[1].Title.Caption Название
DBNavigator1
DataSource
DataSource1
Обратите внимание на то, как записаны SQL-команды. Двоеточие, указанное
идентификатором, показывает, что идентификатор — это параметр, а не имя
поля базы данных. Значение параметра можно установить в коде, т. е. использование параметров в SQL-командах (такие команды называются параметризированными) позволяют формировать запросы во время работы программы.
Модуль программы работы с базой данных Книги приведен в листинге. 6.10.
Глава 6. Базы данных
275
Листинг 6.10. Модуль программы работы с БД Книги
// начало работы программы
void __fastcall TForm1::FormActivate(TObject *Sender)
{
Form1->IBDatabase1->Open();
IBDataSet1->Open(); // выполнить команду SELECT
// отобразить в строке состояния имя базы данных
// и имя пользователя
int p;
p = Pos("=",IBDatabase1->Params[0].Text);
StatusBar1->Panels->Items[0]->Text = IBDatabase1->DatabaseName;
StatusBar1->Panels->Items[1]->Text =
"USER: " + IBDatabase1->Params[0].Text.SubString(p+1,20);
}
// щелчок на кнопке Все записи
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (IBDataSet1->Active) {
IBDataSet1->Close();
}
IBDataSet1->ParamByName("Title")->AsString = "";
IBDataSet1->Open();
}
// Щелчок на кнопке Найти
void __fastcall TForm1::Button2Click(TObject *Sender)
{
IBDataSet1->Close();
IBDataSet1->ParamByName("Title")->AsString = Edit1->Text;
IBDataSet1->Open();
}
Окно программы работы с базой данных Книги приведено на рис. 6.31. Обратите внимание: доступность отдельных кнопок компонента DBNavigator и,
следовательно, действия, которые может выполнить пользователь, определяются его полномочиями (ролью). Так администратор (SYSDBA) может выполнять любые действия (добавлять, удалять и редактировать записи), а guest
(роль PUBLIC) — только просматривать (см. лиcтинг 6.5).
276
Часть II. Практикум программирования
Рис. 6.31. Окно программы работы с базой данных Книги
В программе работы с базой данных Книги размещение файла данных определяет свойство DatabaseName компонента IBDatabase, значение которого задается во время разработки программы. Поэтому, чтобы программа работала у
пользователя, имя компьютера, на котором установлен InterBase, должно
совпадать с именем, заданным программистом. На практике такое жесткое
требование выполнить, как правило, нельзя. Предотвратить возникновение
этой проблемы можно, если предоставить пользователю возможность указать
имя сервера и другие параметры соединения в файле настройки.
Для загрузки параметров соединения с базой данных InterBase из ini-файла
удобно использовать компонент IBDatabaseINI (его свойства приведены в
табл. 6.21).
Таблица 6.21. Cвойства компонента IBDatabaseINI
Свойство
Описание
FileName
Имя ini-файла
UseAppPath
Задает размещение ini-файла
Section
Имя секции в ini-файле, в которой находятся параметры, значения которых будут загружены (метод ReadFromINI) или записаны
(метод SaveToINI) в ini-файл
DatabaseName
База данных — значение параметра DatabaseName
User
Имя пользователя — значение параметра user_name
Password
Пароль — значение параметра password
SQLRole
Роль — значение параметра sql_role
277
Глава 6. Базы данных
Рис. 6.32. Компонент IBDatabaseINI обеспечивает загрузку параметров соединения
После того как компонент IBDatabaseINI будет добавлен на форму
(рис. 6.32), надо выполнить его настройку (табл. 6.22). Также надо очистить
значения свойств DatabaseName и Params компонента IBDatabase.
Таблица 6.22. Значения свойств компонента IBDatabaseINI
Свойство
Значения
FileName
books.ini
UseAppPath
ipoPathNone
Section
Database Settings
Загрузку параметров соединения из ini-файла (листинг 6.11) обеспечивает
функция обработки события FormActivate (листинг 6.12). Сначала метод
LoadFromINI загружает значения параметров в свойства компонента
IBDatabaseINI, затем они передаются в компонент IBDatabase. Создать iniфайл можно вручную или путем вызова метода SaveToINI.
Листинг 6.11. books.ini
[Database Settings]
database=nk/gds_db:books
user_name=guest
password=
sql_role=
lc_ctype=
278
Часть II. Практикум программирования
Листинг 6.12. Функция обработки события FormActivate
// начало работы программы
void __fastcall TForm1::FormActivate(TObject *Sender)
{
// загрузить имя базы данных из ini-файла
// ini-файл находится в том же каталоге, что и exe-файл
AnsiString aPath;
// каталог, в котором находится exe-файл
aPath = ExtractFilePath(Application->ExeName);
IBDatabaseINI1->FileName = aPath +"books.ini";
if (! FileExists(IBDatabaseINI1->FileName) )
{
// ini-файл не найден
IBDatabaseINI1->SaveToINI(); // создать ini-файл
}
IBDatabaseINI1->ReadFromINI(); // загрузить параметры из ini-файла
IBDatabase1->DatabaseName = IBDatabaseINI1->DatabaseName;
IBDatabase1->Params->Add("user_name="+IBDatabaseINI1->Username);
try {
IBDatabase1->Open();
} catch (EIBClientError &e) {
MessageDlg( e.Message + "\nСмотри: " + IBDatabaseINI1->FileName,
mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
IBDataSet1->Open(); // выполнить команду SELECT
// отобразить в строке состояния имя базы данных
// и имя пользователя
int p;
p = Pos("=",IBDatabase1->Params[0].Text);
StatusBar1->Panels->Items[0]->Text = IBDatabase1->DatabaseName;
StatusBar1->Panels->Items[1]->Text =
"USER: " + IBDatabase1->Params[0].Text.SubString(p+1,20);
}
279
Глава 6. Базы данных
Компоненты dbExpress
Существует большое количество задач, в которых нет необходимости предоставлять клиенту возможность интерактивного взаимодействия с базой
данных. Например, в справочно-информационных системах пользователь,
как правило, просматривает записи по одной (от первой до последней), пока
не найдет нужную информацию. Для построения таких систем можно использовать компоненты dbExpress.
Компоненты dbExpress (рис. 6.33) обеспечивают однонаправленный (unidirectional) доступ к базе данных. Это значит, что указатель текущей записи
можно перемещать только в одном направлении — вперед к следующей
записи (при попытке переместить указатель к предыдущей записи возникает
исключение).
Рис. 6.33. Компоненты dbExpress
Следующая программа (ее форма приведена на рис. 6.34) демонстрирует использование компонентов dbExpress для доступа к базе данных InterBase.
Рис. 6.34. Форма программы просмотра базы данных Книги
Компоненты SQLConnection и SQLDataSet обеспечивают доступ к базе данных, компоненты DBEdit — отображение информации, компонент DataSource
связывает компонент SQLDataSet с компонентами отображения данных
(DBEdit) и навигации (DBNavigator).
Перед тем как приступить к настройке компонента SQLConnection, необходимо создать соединение с базой данных: в окне Data Explorer сделать щелчок
280
Часть II. Практикум программирования
правой кнопкой мыши в строке INTERBASE, в появившемся меню выбрать
команду Add New Connection (рис. 6.35, а), затем в окне Add New
Connection надо ввести имя соединения (рис. 6.35, б). После этого надо раскрыть список INTERBASE, сделать щелчок правой кнопкой мыши на имени
созданного соединения, выбрать команду Modify Connection и в появившемся окне (рис. 6.36) ввести имя базы данных, доступ к которой должно обеспечить настраиваемое соединение, а также имя и пароль пользователя.
а
Рис. 6.35. Создание соединения с базой данных InterBase
Рис. 6.36. Настройка соединения
б
281
Глава 6. Базы данных
Информация о соединениях, созданных программистом, хранится в файле
C:\Documents and Settings\All Users\Документы\RAD Studio\dbExpress
\dbxconnections.ini.
После того как соединение с базой данных будет создано и настроено, можно
приступить к настройке компонентов (табл. 6.23). Значения свойств компонентов необходимо устанавливать в том порядке, в котором они перечислены
в таблице. Следует обратить внимание: в процессе настройки компонента
SQLConnection параметры выбранного соединения копируются из файла
dbxconnections.ini в соответствующие поля свойства Params. Если свойству
LoadParamsOnConnect присвоить значение true, то параметры соединения будут загружаться из файла dbxconnections.ini при каждом запуске программы.
Таблица 6.23. Значения свойств компонентов
Компонент
Свойство
Значение
SQLConnection1
Name
SQLConnection1
ConnectionName
books_ib
Name
SQLDataSet1
CommandText
SELECT * FROM BOOKS
SQLConnection
SQLConnection1
Name
DataSource1
DataSet
SQLDataSet1
DataSource
DataSource1
DataField
AUTOR
DataSource
DataSource1
DataField
TITLE
Name
DBNavigator1
DataSource
DataSource1
VisibleButtons.bnFirst
true
VisibleButtons.bnPrior
false
VisibleButtons.bnNext
true
VisibleButtons.bnLast
false
VisibleButtons.bnInsert
false
VisibleButtons.bnDelete
false
SQLDataSet1
DataSource1
DBEdit1
DBEdit2
DBVavigator1
282
Часть II. Практикум программирования
Таблица 6.23 (окончание)
Компонент
Свойство
Значение
VisibleButtons.bnEdit
false
VisibleButtons.bnPost
false
VisibleButtons.bnCancel
false
VisibleButtons.bnRefresh
false
После того как компоненты будут настроены, надо создать функцию обработки события Activate формы (листинг 6.13). Эта функция открывает соединение с базой данных, в результате в полях редактирования появляется
содержимое первой записи.
Листинг 6.13. Обработка события FormActivate
void __fastcall TForm1::FormActivate(TObject *Sender)
{
AnsiString as;
int n; // кол-во элементов списка Params
int p;
int i;
SQLConnection1->LoadParamsFromIniFile("books.ini");
try {
SQLConnection1->Open();
SQLDataSet1->Open();
n = SQLConnection1->Params->Count;
// отобразить в строке состояния
// имя пользователя и имя базы данных
for (i = 0; i < n; i++)
{
as = WideCharToString(SQLConnection1->Params[0].Strings[i]);
p = as.Pos("User_Name");
if (p != 0 )
StatusBar1->Panels->Items[0]->Text = as;
Глава 6. Базы данных
283
p = as.Pos("database");
if (p != 0 )
StatusBar1->Panels->Items[1]->Text = as;
}
StatusBar1->Panels->Items[2]->Text =
"Записей: "+ IntToStr(SQLDataSet1->RecordCount);
}
catch (EDatabaseError &e)
{
StatusBar1->Panels->Items[2]->Text = e.Message;
}
}
Как было сказано ранее, компоненты dbExpress обеспечивают только однонаправленный режим перемещения курсора (указателя текущей записи), что
не позволяет напрямую использовать DBGrid для отображения данных в табличной форме (при попытке переместить указатель текущей записи назад
возникает исключение). Тем не менее DBGrid все-таки можно использовать
для отображения данных, полученных через dbExpress. Следующая программа (ее форма приведена на рис. 6.37) показывает, как это сделать.
Рис. 6.37. Форма программы работы с базой данных Книги
284
Часть II. Практикум программирования
Чтобы для просмотра данных, доступ к которым обеспечивают компоненты
dbExpress, можно было использовать DBGrid, на форму необходимо поместить
компоненты ClientDataSet и DataSetProvider. Компонент ClientDataSet
обеспечит хранение информации, полученной из базы данных, а компонент
DataSetProvider — cвязь между компонентами SQLDataSet и ClientDataSet
(информация попадает в SQLDataSet и передается в ClientDataSet). Компонент DataSorce связывает компонент ClientDataSet с компонентом DBGrid.
После того как компоненты будут помещены на форму, надо выполнить их
настройку (табл. 6.24). Первым следует настроить компонент SQLConnection.
Необходимо обратить внимание на то, что значения свойств следует устанавливать в том порядке, в котором они перечислены в таблице.
Модуль формы программы работы с базой данных Книги приведен в листинге 6.14.
Таблица 6.24. Значения свойств компонентов
Компонент
Свойство
Значение
SQLConnection1
Name
SQLConnection1
ConnectionName
books_ib
LoginPrompt
false
Name
SQLDataSet1
CommandText
SELECT * FROM Books
SQLConnection
SQLConnection1
Name
DataSetProvider1
DataSet
SQLDataSet1
Name
ClientDataSet11
ProviderName
DataSetProvider1
Name
DataSource1
DataSet
ClientDataSet
DataSource
DataSet1
Font.Name
Tahoma
Font.Size
9
Columns[0].FieldName
Author
Columns[0].TitleCaption
Автор
Columns[0].Title.Width
120
SQLDataSet1
DataSetProvider1
ClientDataSet1
DataSource1
DBGrid1
285
Глава 6. Базы данных
Таблица 6.24 (окончание)
Компонент
Свойство
Значение
Columns[0].Title.Font.Style
fsBold
Columns[1].FieldName
Title
Columns[1].TitleCaption
Название
Columns[1].Width
450
Columns[1].Title.Font.Style
fsBold
Листинг 6.14. Программа работы с базой данных Книги
// начало работы программы
void __fastcall TForm1::FormActivate(TObject *Sender)
{
try
{
SQLConnection1->LoadParamsFromIniFile("books.ini");
}
catch (...) {
StatusBar1->SimpleText = "Ошибка загрузки books.ini";
}
// при попытке получить доступ к БД возможны ошибки
try
{
SQLDataSet1->Open();
ClientDataSet1->Open();
Label2->Caption =
"Наименований:" + IntToStr(ClientDataSet1->RecordCount);
}
catch (EDatabaseError &e)
{
ShowMessage("Ошибка доступа к файлу базы данных. "+ e.Message );
Edit1->Enabled = false;
Button3->Enabled = false;
DBGrid1->Enabled = false;
}
}
// Щелчок на кнопке Найти
void __fastcall TForm1::Button3Click(TObject *Sender)
286
Часть II. Практикум программирования
{
AnsiString cmd;
cmd = "SELECT * FROM Books WHERE UPPER(Title) LIKE UPPER('%"
+Edit1->Text+"%')";
StatusBar1->SimpleText = cmd; // показать SQL-команду, направляемую
серверу
// При попытке изменить значение cвойства CommandText открытого
// набора данных (компонента SQLDataSet) возникает ошибка.
// Поэтому перед тем как изменить значение CommandText,
// надо закрыть набор данных.
SQLDataSet1->Close();
ClientDataSet1->Close();
SQLDataSet1->CommandText = cmd;
SQLDataSet1->Open();
ClientDataSet1->Open();
Label2->Caption = "Наименований:" +
IntToStr(ClientDataSet1->RecordCount);
}
Следует обратить внимание на функцию обработки события Activate. Она
загружает параметры соединения (имя сервера и псевдоним базы данных,
имя и пароль пользователя) из файла book.ini (листинг 6.15). Таким образом
пользователь, изменив значение параметров в файле book.ini, может выполнить настройку программы работы с базой данных. Нетрудно заметить, что
содержимое файла book.ini — это фрагмент файла dbxconnections.ini.
Листинг 6.15. Файл инициализации соединения с сервером
[BOOKS_IB]
drivername=INTERBASE
blobsize=-1
commitretain=False
database=nk/gds_db:books
localecode=0000
Password=guest
sqldialect=3
287
Глава 6. Базы данных
interbase transisolation=ReadCommited
User_Name=guest
waitonlocks=True
trim char=False
Установка программы работы
с БД на другой компьютер
Для того чтобы пользователь мог работать с базой данных InterBase, на его
компьютер необходимо перенести программу работы с базой данных (лучше
в отдельный каталог), драйвер, файлы инициализации драйвера и соединения.
Также на компьютере должен быть установлен клиент InterBase, а в файле
hosts должно быть указано имя и IP-адрес компьютера, на котором работает
сервер InterBase.
В качестве примера в таблице приведен список файлов, образующих приложение работы с базой данных Книги (books.ib), которое для доступа к данным
использует технологию (компоненты) dbExpress. Помимо файлов, указанных
в табл. 6.25, на компьютер пользователя необходимо перенести библиотеки
cc3280mt.dll и borlndmm.dll.
Таблица 6.25. Файлы, образующие приложение
работы с базой данных InterBase Книги
Файл
Комментарий
books.exe
Приложение работы с базой данных Книги (скомпилировано в
режиме включения кода пакетов в exe-файл — флажок Build with
runtime packages сброшен)
dbxint30.dll
Драйвер InterBase
dbxdrivers.ini
Файл инициализации драйвера
books.ini
Файл инициализации соединения с базой данных (фрагмент файла dbxconnections.ini)
База данных Blackfish SQL
В RAD Studio 2007 включен новый сервер баз данных Blackfish SQL Server.
Являясь полноценным SQL-сервером, он, в отличие, например, от сервера
InterBase, практически не требует администрирования, что делает использование этого сервера в информационных системах среднего уровня сложности
наилучшим решением.
288
Часть II. Практикум программирования
Установка
На компьютер разработчика сервер Blackfish SQL устанавливается как служба — автоматически вместе с другими компонентами среды разработки. Запускается сервер также автоматически при каждом включении компьютера.
Чтобы убедиться, что сервер запущен, надо раскрыть окно Службы
(рис. 6.38) — в окне Панель управления сделать щелчок на значке Администрирование, а затем в появившемся окне Администрирование щелкнуть на
значке Службы.
Рис. 6.38. Окно Службы
Перед тем как приступить к разработке программы работы с базой данных,
рекомендуется выполнить настройку Blackfish SQL. Надо в файле конфигурации bsqlserver.exe.config (по умолчанию он находится в каталоге
C:\Program Files\CodeGear\RAD Studio\5.0\bin) задать значение ключа
dataDirectory, который определяет размещение файлов базы данных. Ниже
приведен фрагмент файла конфигурации, в котором устанавливается значение ключа dataDirectory:
<add key="blackfishsql.dataDirectory" value="D:\Database" />
Доступ к серверу
Доступ к серверу Blackfish SQL есть только у администратора. Только он может создать базу данных и открыть ее для других пользователей. Здесь следу-
Глава 6. Базы данных
289
ет обратить внимание на то, что в Blackfish пользователи баз банных не регистрируются на сервере так, как это делается, например, в InterBase или в
Misrosoft SQL Server. Вся информация о пользователях и их полномочиях
хранится не на сервере (в системной базе данных), а в самой базе данных.
По умолчанию сразу после установки сервера имя администратора (LoginID) —
sysdba, пароль — masterkey.
Создание базы данных
База данных Blackfish SQL создается путем направления серверу команды
CREAE DATABASE от имени администратора. Следует обратить внимание на то,
для Blackfish SQL нет специальной утилиты, подобной, например, IBConsole
или isql для InterBase, обеспечивающей создание баз данных. Вместе с тем,
C++ Builder предоставляет возможность создания базы данных Blackfish при
помощи Data explorer.
Процесс создания базы Blackfish рассмотрим на примере базы данных Книги.
Сначала надо создать соединение с базой данных. Чтобы это сделать, нужно в
окне Data explorer щелкнуть правой кнопкой мыши в строке BLACKFISHSQL и в появившемся списке выбрать команду Add New Connection
(рис. 6.39, а). Затем в появившемся окне Add New Connection (рис. 6.39, б)
нужно ввести имя соединения.
Информация обо всех созданных программистом соединениях записывается в
файл c:\Documents and Settings\All Users\Документы\RAD Studio\dbExpress
\dbxconnections.ini.
После того как соединение будет создано, надо выполнить его настройку.
Сначала надо раскрыть список соединений BLACKFISHSQL, сделать щелчок правой кнопкой мыши на имени соединения и в появившемся списке выбрать команду Modify Connection (рис. 6.40).
Затем в окне Add Connection (рис. 6.41) в поле Server Name следует ввести
сетевое имя компьютера, на котором установлен Blackfish SQL (вместо имени компьютера можно указать localhost). В поле Database Name нужно ввести имя базы данных (если перед именем базы данных указать макрос
|DataDirectory|, то база будет создана в каталоге, имя которого указано в
файле bsqlserver.exe.config в качестве параметра ключа DataDirectory) и сделать щелчок на кнопке Advanced. Затем в открывшемся окне Advanced
Properties (рис. 6.42) следует присвоить свойству create значение true,
290
Часть II. Практикум программирования
а
Рис. 6.39. Создание соединения с базой данных Blackfish
Рис. 6.40. Начало настройки соединения
б
291
Глава 6. Базы данных
Рис. 6.41. Окно Add Connection
Рис. 6.42. Чтобы база данных была создана,
свойству create надо присвоить значение true
закрыть окно Advanced Properties и в окне Add Connection сделать щелчок
на кнопке TestConnection. В результате этих действий будет создана база
данных Blackfish SQL, это файлы: books.jds, books_LOGA_0000000000 и
books_LOGA_ANCHOR.
292
Часть II. Практикум программирования
После того как база данных будет создана, можно приступить к созданию
таблиц и наполнению их информацией. Делается это путем направления серверу соответствующих SQL-команд.
Чтобы направить серверу SQL-команду, например, создания в базе данных
таблицы, сначала надо открыть окно SQL Window: раскрыть список соединений, сделать щелчок правой кнопкой мыши на имени соединения, обеспечивающего доступ к нужной базе данных, и в появившемся списке выбрать
команду SQL Window (рис. 6.43). В результате этих действий откроется
страница Data Explorer (рис. 6.44), в нижней части которой можно набирать
SQL-команды.
Рис. 6.43. Команда SQL Window
Создание таблицы Books в базе данных Книги обеспечивает команда
CREATE TABLE BOKS ( TITLE CHAR(60) NOT NULL, AUTHOR CHAR(30) )
Процесс ее выполнения активизируется щелчком на кнопке Execute SQL
(рис. 6.45).
293
Глава 6. Базы данных
Рис. 6.44. Страница Data Explorer
Рис. 6.45. Кнопка Execute SQL
Доступ к базе данных
Изначально доступ к базе данных есть только у администратора (базу данных
Blackfish может создать только он). Чтобы у другого пользователя был доступ к базе данных, он должен быть зарегистрирован как пользователь этой
базы данных. Зарегистрировать нового пользователя базы данных может
администратор или другой пользователь, обладающий правами администратора.
Создание пользователя базы данных обеспечивает команда
CREATE USER UserID PASSWORD "password"
где UserID и password — идентификатор и пароль пользователя.
Например, команда
CREATE guest PASSWORD "guest"
294
Часть II. Практикум программирования
создает пользователя guest (учетную запись пользователя), который для доступа к базе данных должен использовать пароль guest.
Права пользователей
Пользователи, имеющие доступ к базе данных, могут обладать разными правами. Например, одному пользователю может быть разрешено только просматривать записи, другому — просматривать и изменять, а третьему — просматривать, добавлять и изменять.
Определить права доступа пользователя можно как на уровне доступа к базе
данных в целом, так и на уровне доступа к отдельным таблицам.
Определить права пользователя можно, направив серверу команду
GRANT privilege TO UserID
где privilege — список прав (табл. 6.26), UserID — идентификатор пользователя.
Таблица 6.26. Права пользователя на уровне базы данных
Идентификатор
Права
STARTUP
Может открыть базу данных
WRITE
Может записывать информацию в базу данных
CREATE
Может создавать новые таблицы
DROP
Может удалять таблицы
RENAME
Может переименовывать таблицы
ADMINISTRATOR
Может открыть доступ к базе данных другим пользователям
(создать пользователя), может изменить права существующих
пользователей, может выполнять другие действия (WRITE,
CREATE, DROP, RENAME), а также выполнить шифрование базы
данных
Например, команда
GRANT STARTUP TO platon
открывает базу данных пользователю platon для просмотра,
а команда
GRANT STARTUP, WRITE TO danila
предоставляет пользователю danila право записи в базу данных.
Глава 6. Базы данных
295
Команду GRANT можно использовать и для определения прав доступа к таблицам базы данных.
В этом случае команда выглядит так:
GRANT privileges ON table TO UserID
где:
ˆ privileges — список прав (SQL-команд, которые пользователь может на-
править серверу);
ˆ table — таблица базы данных;
ˆ UserID — идентификатор пользователя.
Например, команды, определяющие полномочия доступа пользователей
таблице books могут быть такими:
platon и danila к
GRANT SELECT ON books TO platon
GRANT SELECT, INSER, UPDATE ON books TO danila
Как видно, пользователь platon может только просматривать таблицу books, а
пользователь danila — просматривать, добавлять и редактировать информацию.
Если нескольким пользователям надо предоставить одинаковые права, то
вместо того чтобы определять права каждого из них, можно определить (создать) роль, указать права для этой роли, а затем назначить роль пользователям.
Команда, обеспечивающая создание роли, в общем виде выглядит так:
CREATE ROLE RoleID
где RoleID — идентификатор роли.
Пример:
CREATE ROLE operator
Команда определения полномочий роли идентична команде определения
полномочий пользователя.
Например, команда
GRANT SELECT, INSER, UPDATE ON books TO operator
определяет полномочия роли operator.
После того как роль определена, ее можно назначить конкретному пользователю.
Команда назначения роли пользователю в общем виде выглядит так:
GRANT RoleID TO UserID
296
Часть II. Практикум программирования
Например, команда
GRANT operator TO larisa
предоставляет пользователю larisa полномочия в соответствии с ролью
operator.
В каждой базе данных по умолчанию определена роль PUBLIC. Эта роль обычно используется для обеспечения доступа к таблицам базы данных в режиме
"только просмотр". Особенность этой роли заключается в том, что она автоматически назначается пользователям, полномочия которых явно (при помощи команды GRANT) не заданы. Следует обратить внимание на то, что полномочия роли PUBLIC по умолчанию не определены, их надо указывать явно.
Например, команда
GRANT SELECT ON books TO PUBLIC
открывает таблицу books для просмотра всем пользователям базы данных,
права которых не указаны явно.
База данных Книги
Процесс разработки приложения работы с базой данных Blackfish SQL рассмотрим на примере программы, обеспечивающей работу с базой данных
Книги.
Сначала надо создать базу данных Книги (books), поместить в нее таблицу
данные, открыть доступ к базе данных пользоватеполномочия. Характеристики полей таблицы books
приведены в табл. 6.27, SQL-команды, обеспечивающие выполнение описанной выше задачи, — в листинге. 6.16.
books, записать в таблицу
лю gust и определить его
Таблица 6.27. Поля тaблицы books
Поле
Тип
Примечание
TITLE
CHAR(60)
Обязательное поле
AUTHOR
CHAR(25)
Листинг. 6.16. Создание таблицы и определение полномочий
пользователя guest
CREATE TABLE BOOKS(TITLE CHAR(60) NOT NULL, AUTHOR CHAR(30))
INSERT INTO BOOKS(TITLE,AUTHOR)
VALUES("C# в примерах и задачах", "Культин Н.Б.")
297
Глава 6. Базы данных
INSERT INTO BOOKS(TITLE,AUTHOR)
VALUES("Delphi в примерах и задачах", "Культин Н.Б.")
CREATE USER guest PASSWORD "guest"
GRANT SELECT ON BOOKS TO public
Доступ к базе данных Blackfish SQL обеспечивают компоненты dbExpress
(рис. 6.46). Следует обратить внимание на то, что архитектура DBEXPRESS
реализует только однонаправленный (unidirectional) доступ к данным. Это
значит, что указатель текущей записи может перемещаться в одном направлении (только к следующей записи). Именно поэтому для просмотра данных
в режиме таблицы использовать компонент DataGrid напрямую нельзя: при
попытке переместить указатель текущей строки (записи) в предыдущую
строку возникает исключение. Чтобы обеспечить возможность просмотра
данных в режиме таблицы, в форму приложения необходимо добавить компонент ClientDataSet, который обеспечит буферизацию данных и возможность перемещения указателя текущей записи "назад" (к предыдущей записи).
Рис. 6.46. Компоненты dbExpress
Форма программы работы с базой данных Книги приведена на рис. 6.47. Компонент SQLConnection обеспечивает соединение с базой данных, компонент
SQLDataSet — хранит информацию, полученную в результате выполнения запроса (команды SELECT). Компонент ClientDataSet используется в качестве
буфера, он хранит информацию, полученную из базы данных, и обеспечивает
возможность ее просмотра при помощи компонента DataGrid. Связь между
компонентами SQLDataSet и ClientDataSet обеспечивает компонент
DataSetProvider, между компонентами ClientDataSet и DBGrid — компонент
DataSourse.
298
Часть II. Практикум программирования
Рис. 6.47. Форма программы работы с базой данных Книги
Значения свойств компонентов приведены в табл. 6.28. Необходимо обратить
внимание на то, что значения следует устанавливать в том порядке, в котором
они приведены в тaблице.
Таблица 6.28. Значения свойств компонентов
Компонент
Свойство
Значение
SQLConnection1
Name
SQLConnection1
ConnectionName
books
LoginPrompt
false
LoadParamsOnConnect
true
Name
SQLDataSet1
CommandText
SELECT * FROM BOOKS
SQLConnection
SQLConnection1
Name
DataSetProvider1
DataSet
SQLDataSet1
Name
ClientDataSet11
ProviderName
DataSetProvider1
SQLDataSet1
DataSetProvider1
ClientDataSet11
299
Глава 6. Базы данных
Таблица 6.28 (окончание)
Компонент
Свойство
Значение
DataSource1
Name
DataSource1
DataSet
ClientDataSet
Font.Name
Tahoma
Font.Size
9
Name
DataGrid1
DataSource
DataSource1
ReadOnly
true
Columns[0].FieldName
AUTHOR
Columns[0].TitleCaption
Автор
Columns[0].Title.Width
120
Columns[0].Title.Font.Style
fsBold
Columns[1].FieldName
TITLE
Columns[1].TitleCaption
Название
Columns[1].Width
450
Columns[1].Title.Font.Style
fsBold
DataGrid1
Процедуры обработки событий приведены в листинге 6.17.
Листинг 6.17. Процедуры обработки событий
void __fastcall TForm1::FormActivate(TObject *Sender)
{
AnsiString as;
int n; // кол-во элементов списка Params
int p;
int i;
n = SQLConnection1->Params->Count;
// отобразить имя пользователя и имя базы данных
// в строке состояния
for (i = 0; i < n; i++) {
as = WideCharToString(SQLConnection1->Params[0].Strings[i]);
300
Часть II. Практикум программирования
p = as.Pos("user_name");
if (p != 0 ) {
StatusBar1->Panels->Items[0]->Text = as;
}
p = as.Pos("Database");
if (p != 0 ) {
StatusBar1->Panels->Items[1]->Text = as;
}
}
try
{
SQLConnection1->Open();
ClientDataSet1->Open();
}
catch ( TDBXError &e)
{
ShowMessage(e.Message);
}
}
// щелчок на кнопке Найти
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString cmd;
cmd = "SELECT * FROM BOOKS WHERE UPPER(TITLE) like UPPER('%"+
Edit1->Text + "%')";
// ShowMessage(cmd);
/*
При попытке изменить значение свойства CommandText
открытого набора данных возникает исключение,
поэтому перед тем как изменить значение свойства
CommandText, закроем набор данных. }
*/
SQLConnection1->Close();
ClientDataSet1->Close();
Глава 6. Базы данных
301
SQLDataSet1->CommandText = cmd;
SQLConnection1->Open();
ClientDataSet1->Open();
if ( SQLDataSet1->RecordCount == 0 )
{
ShowMessage("В БД нет записей, удовлетворяющих критерию запроса");
}
}
// нажатие клавиши в поле Edit1
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if ( Key == VK_RETURN) {
Button1->SetFocus();
}
}
Как было сказано ранее, параметры соединений, созданных программистом,
находятся в файле dbxconnections.ini, из которого они (при настройке компонента SQLConnection) копируются в свойство Params. Если вы предполагаете,
что программа работы с базой данных будет устанавливаться на другие компьютеры, то свойству LoadParamsOnConnect компонента SQLConnction следует
присвоить значение true. В этом случае параметры соединения будут загружаться из файла dbxconnections.ini при каждом открытии соединения. Такое
решение позволяет выполнять настройку программы работы с базой данных
путем внесения изменений в файл конфигурации dbxconnections.ini.
Развертывание приложения работы
с базой данных
Установка и настройка Blackfish SQL
Сервер Blackfish SQL является .NET-приложением. Поэтому перед тем как приступить к установке Blackfish SQL, необходимо убедиться в том, что на том компьютере, куда устанавливается Blackfish SQL, есть Microsoft .NET Framework
(на компьютер программиста Microsoft .NET Framework устанавливается автоматически вместе с RAD Studio). Следует обратить внимание: платформа
Microsoft .NET Framework используется многими современными программами и,
вполне вероятно, что на компьютере пользователя она уже установлена
(Microsoft .NET Framework гарантированно есть на компьютере с Windows Vista).
302
Часть II. Практикум программирования
Сначала на диск сервера (лучше в отдельный каталог) надо скопировать файлы
BSQLServer.exe, Borland.Data.Blackfish.LocalClient.dll, BSQLServer.exe.config,
а также файл лицензии (slip-файл). После этого следует определить каталог,
предназначенный для файлов баз данных. Имя этого каталога надо указать в
файле конфигурации сервера (BSQLServer.exe.config) в качестве значения
ключа blackfisfsql.dataDirectory, например:
<add key="blackfishsql.dataDirectory" value="D:\Database" />
Следует обратить внимание: если значение ключа blackfisfsql.dataDirectory
задано, то в строке Database файла параметров соединения вместо пути к базе данных можно указать макроc — строку |DataDirectory|.
Например:
database=|Datadirectory|books
После этого надо открыть окно командной строки и набрать команду
Каталог\BSQLServer.exe –install,
Рис. 6.48. Настройка брандмауэра
303
Глава 6. Базы данных
где Каталог — имя каталога, в котором находятся файлы Blackfish SQL
Server. Эта команда обеспечивает установку Blackfish SQL Server как службу.
Теперь при каждом включении сервера (компьютера) Blackfish SQL будет
запускаться автоматически.
При установке службы Blackfish SQL Server в Windows Vista окно командной
строки надо открыть от имени администратора.
Брандмауэр Windows по умолчанию блокирует доступ клиента (программы работы с базой данных) к серверу. Поэтому после установки Blackfish SQL Server
необходимо в список исключений брандмауэра добавить ссылку на BSQLServer
(рис. 6.48).
Установка программы работы с базой данных
Процесс установки программы работы с базой данных Blackfish на компьютер пользователя состоит из двух шагов. Сначала на диск компьютера (лучше
в отдельный каталог) надо скопировать файлы, образующие программу работы с базой данных (список файлов программы работы с базой данных Книги
приведен в табл. 6.29). Помимо файлов, указанных в табл. 6.29, на компьютер
пользователя необходимо перенести библиотеки cc3280mt.dll и borlndmm.dll.
Таблица 6.29. Файлы программы работы с базой данных Книги
Файл
Комментарий
books.exe
Приложение работы с базой данных Blackfish Книги (скомпилировано в режиме включения кода пакетов в exeфайл — флажок Build with runtime packages сброшен)
dbxint30.dll
Драйвер
dbxdrivers.ini
Файл инициализации драйвера
dbxconnections.ini
Файл инициализации соединения с базой данных (параметры соединения находятся в секции books)
Затем надо выполнить настройку программы — в файле параметров соединения dbxconnections.ini указать сетевое имя сервера. Кроме этого, в файл
C:\Windows\System32\drivers\ets\hosts клиента надо записать имя и IP-адрес
сервера (узнать IP-адрес сервера можно, запустив на сервере утилиту
ipconfig.exe).
304
Часть II. Практикум программирования
В качестве примера в листинге 6.18 приведен фрагмент файла
dbxconnections.ini, а в листинге 6.19 — файла hosts. Обратите внимание:
в файле конфигурации указан макрос |DataDirectory|, поэтому в файле BSQLServer.exe.config должно быть указано значения ключа
blackfisfsql.dataDirectory.
Листинг 6.18. Параметры соединения с базой данных Книги (dbxconnections.ini)
[books]
drivername=BLACKFISHSQL
User_Name=guest
port=2508
create=false
readonlydb=false
HostName=Danila
Database=|DataDirectory|books
Листинг 6.19. Файл hosts
127.0.0.1
192.168.1.5
localhost
nk
Download