Краткое руководство по созданию клиентов к СУБД BDE в Borland Developer Studio

Александр Геннадьевич Фенстер, fenster@fenster.name
Для студентов 2 курса ММФ НГУ (вводный курс по C++ Builder).

Действия по созданию базы данных и таблиц

Создание базы данных

Для управления базами данных BDE (Borland Database Engine) на локальном компьютере используется программа BDE Administrator (Пуск — Выполнить — C:\Program Files\Common Files\Borland Shared\BDE\bdeadmin.exe либо поместить на форму компонент Table с вкладки BDE, щёлкнуть по нему правой кнопкой и выбрать Explore). После запуска в левом поле отображается список баз данных, созданных на данном компьютере, справа для выбранной базы данных отображены её свойства (а именно, драйвер, используемый для доступа к базе, и путь на диске, где расположены файлы этой базы данных).

Для создания новой базы данных необходимо в меню Object выбрать пункт New. Значение Database Driver Name оставить STANDARD. В появившемся слева списке переименовать (F2) созданную базу (обычно STANDARD1) и в правой части окна в графе PATH указать путь к таблицам (любой каталог на диске, где вы планируете создавать таблицы или куда вы их скопировали, например, на вашем сетевом диске). Затем нажать кнопку с синей стрелкой или выбрать пункт Apply в меню Object (для сохранения изменений). Операцию по созданию базы данных необходимо будет проводить на каждом компьютере, куда вы скопируете свою программу.

Альтернативным (пожалуй, не очень хорошим) вариантом будет расположение таблиц базы данных в каталоге программы, в таком случае в поле DatabaseName компонентов Table и Query нужно указывать путь к каталогу, в котором находятся таблицы.

Создание таблиц

Для работы с таблицами используется программа Database Desktop (Пуск — Выполнить — dbd32). Внимание: при работе в терминальном классе сразу после запуска программы измените пути к Private directory и Working directory (соответствующие пункты в меню File) — там должны быть указаны каталоги, в которые у вас есть право записи, например, C:\Work.

Чтобы создать новую таблицу, необходимо выбрать пункт меню File — New — Table и согласиться с типом таблицы Paradox 7. После этого вам будет предложено указать, какие поля содержатся в таблице. Каждое поле имеет имя (идентификатор, состоящий из латинских букв, цифр и знака подчёркивания) и тип. Определены несколько типов, из которых наиболее часто используемыми являются:

Одно или несколько полей можно сделать ключами (Key), тогда СУБД будет требовать, чтобы значения этих полей или группы полей не повторялись в пределах таблицы. Если поле имеет тип Autoincrement, значения ему будут присваиваться автоматически базой данных при добавлении новой записи в таблицу. Удобно делать поля ID всех таблиц (кроме, конечно, таблиц связи) + (Autoincrement) и ставить им атрибут Key.

После создания таблицы её необходимо сохранить, выбрав в поле Alias внизу диалогового окна имя созданной базы данных. Затем таблицу можно открыть для добавления начальных данных. Для редактирования записей необходимо перейти в режим редактирования (Table — Edit data или F9), а для сохранения данных — выйти из режима редактирования.

Для изменения структуры таблицы используется пункт меню Table — Restructure. Таблица при этом не должна использоваться в Borland C++ Builder.

При появлении проблем с доступом (Table is in use и похожие ошибки) решение номер 1 — закрыть С++ Builder и Database Desktop и открыть заново.

Работа с базой данных из С++ Builder

Доступ к данным через компоненты Table и Query

Для получения данных из баз данных BDE в программе на C++ Builder используются два компонента с вкладки BDE: Table и Query. Обеим компонентам необходимо проставить свойство DatabaseName (имя базы данных), компоненту Table также необходимо проставить свойство TableName (имя таблицы). Я не рекомендую ставить атрибут Active = true для таблиц на этапе создания формы, лучше активировать таблицу позже при запуске программы.

Пример работы с компонентом Query: перебор всех записей из таблицы t1 с полями A и B:

Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT a, b FROM t1");
Query1->Open();

Query1->First();
while (!Query1->Eof) {
    ShowMessage(Query1->FieldByName("a")->AsString);
    Query1->Next();
}

В первой части примера подготавливается запрос и отправляется СУБД для исполнения. После вызова Query1->Open() выборка оказывается «внутри» компонента Query и можно получить доступ к данным перебором, как показано в примере (цикл while). Для текущей записи получить значение любого поля можно при помощи метода FieldByName. Возможные преобразования: AsInteger, AsString, AsDateTime и прочие (используйте Ctrl+пробел для вывода всех вариантов).

В запросах INSERT, DELETE, UPDATE вместо Query1->Open() необходимо использовать Query1->ExecSQL(), т.к. эти запросы не возвращают никакую выборку, а лишь выполняют соответствующее действие.

Перебор записей таблицы Table производится аналогично.

Отображение данных из базы при помощи специальных компонентов

Помимо стандартных компонентов, для отображения данных из базы можно использовать компоненты с вкладки Data Controls, которые могут получать данные из таблиц. Для того, чтобы связать компонент с вкладки Data Controls с таблицей, необходимо использовать компонент DataSource с вкладки Data Access, указав ему в свойстве DataSet таблицу Table или запрос Query. После этого этот компонент DataSource можно указать в соответствующем поле (DataSource или ListSource) компонента с вкладки Data Controls.

Из всех компонентов с вкладки Data Controls особенно следует отметить компоненты DBGrid (аналог StringGrid, берущий данные из DataSource, связанного с Table или Query) и DBLookupComboBox, предоставляющий удобный способ выбора одного из возможных значений. Для работы DBLookupComboBox необходимо установить значения для полей ListSource (не DataSource!), ListField (поле, которое будет отображаться в компоненте) и KeyField. Например, для таблицы people, состоящей из полей id и name, можно выставить ListField = "name" и KeyField = "id", тогда пользователь сможет выбрать человека по имени, а из программы можно будет получить как выбранное имя (DBLookupComboBox1->Text), так и его идентификатор (DBLookupComboBox1->KeyValue).

Язык запросов SQL

Достаточно подробная информация по диалекту SQL, который используется в BDE, доступна в файле помощи localsql.hlp, который поставляется с Borland Developer Studio. Для выполнения задания вполне достаточно уметь писать простые запросы SELECT и запросы INSERT, DELETE, UPDATE.

Частая проблема: если вы назовёте поле таблицы ключевым словом, самые невинные запросы типа select name from people будут вызывать ошибку. В таких случаях в BDE используется select "name" from people. Список всех ключевых слов приведён в localsql.hlp (раздел Reserved words).

Работа с базой данных без SQL-запросов

Компонент Table предоставляет возможность работы с базой данных (выборки данных, изменения, добавления и удаления записей) без явного написания SQL-запросов при помощи методов Edit, Insert, Delete, Post и прочих. Лично мне кажется, что удобнее использовать SQL-запросы и Query, так что я не требую обязательного применения этих возможностей Table в ваших программах и не описываю их здесь. За подробной информацией обращайтесь в документацию по C++ Builder.