Глава 14
Процессор баз данных Borland Database Engine
Любое приложение баз данных имеет в своем составе или использует сторонний механизм доступа к данным, который берет на себя подавляющее большинство стандартных низкоуровневых операций работы с базами данных. Например, любое такое приложение при открытии таблицы БД должно выполнить примерно одинаковый набор операций.
Очевидно, что если все стандартные функции доступа к данным реализовать в виде специальной программы, сервиса или динамической библиотеки, то это существенно упростит разработку приложений баз данных, которым для выполнения той или иной операции достаточно будет вызвать готовую процедуру.
Взаимодействие приложения, созданного в среде разработки Delphi 5, и базы данных обеспечивает процессор баз данных Borland Database Engine 5. Он представляет собой набор динамических библиотек, функции которых позволяют не только обращаться к данным, но и эффективно управлять ими на стороне приложения.
Компоненты доступа к данным Delphi для работы с базами данных используют возможности BDE, обращаясь к его функциям и процедурам. Механизм доступа к BDE инкапсулирован в базовом классе TBDEDataSet. (Подробно базовые классы компонентов доступа к данным рассмотрены далее в этой части.) Поэтому в процессе программирования у вас не будет необходимости использовать функции BDE напрямую. Почти все, что можно сделать путем прямого обращения, можно сделать и через компоненты, это проще и надежнее.
Тем не менее, внутреннюю организацию механизма доступа к данным всегда полезно знать. Кроме этого,'всегда полезно знать и уметь использовать дополнительные возможности, которые BDE может предоставить разработчику.
BDE взаимодействует с базами данных посредством драйверов. Для наиболее распространенных локальных СУБД разработай набор стандартных драйверов. Работа с наиболее распространенными серверами БД осуществ ляется при помощи драйверов системы SQL Links. Кроме этого, если для базы данных существует драйвер ODBC, то можно использовать и его. Достаточно зарегистрировать этот драйвер в BDE.
Однако при всех своих преимуществах BDE не претендует на всеобъемлющую универсальность и имеет некоторые недостатки. К ним, например, относится снижение скорости работы приложения, недостатки реализации некоторых драйверов и т. д.
Поэтому в Delphi 5 разработчику доступны альтернативные способы доступа к базам данным. Перечислим их.
Подробностями использования перечисленных инструментов мы займемся позднее, а сейчас остановимся на возможностях BDE.
Разработчики Delphi 5 постарались на славу и существенно расширили доступный программистам инструментарий для доступа к базам данных. Однако не стоит немедленно переходить на новейшие технологии: ведь большинство приложений баз данных работают на отдельных компьютерах или в небольших локальных сетях. А именно в таких средах приложения на основе BDE имеют наилучшее соотношение стоимость разработки/эффективность работы.
Итак, в этой главе обсуждаются следующие вопросы.
Архитектура и функции BDE
BDE представляет собой набор динамических библиотек, которые "умеют" передавать запросы на получение или модификацию данных из приложения
в нужную базу данных и возвращать результат обработки. В процессе работы библиотеки используют вспомогательные файлы языковой поддержки и информацию о настройках среды.
В составе BDE поставляются стандартные драйверы, обеспечивающие доступ к СУБД Paradox, dBASE, FoxPro и текстовым файлам. Локальные драйверы (рис. 14.1) устанавливаются автоматически совместно с ядром процессора. Один из них можно выбрать в качестве стандартного драйвера, который имеет дополнительные настройки, влияющие на функционирование процессора БД.
Рис. 14.1. Структура процессора баз данных BDE
Доступ к данным серверов SQL обеспечивает отдельная система драйверов — SQL Links. С их помощью в Delphi можно без особых проблем разрабатывать приложения для серверов Oracle 8, Informix, Sybase, DB2 и, естественно, InterBase. Эти драйверы необходимо устанавливать дополнительно.
Помимо этого, в BDE имеется очень простой механизм подключения любых драйверов ODBC (например, Microsoft Access) и создания на их основе со-кетов ODBC.
С точки зрения пользователя процесс подключения локального драйвера и драйвера SQL Links практически не отличается, за исключением деталей настройки-. Настройка драйверов и собственных параметров BDE осуществляется при помощи специальной утилиты — BDE Administrator и рассматривается далее в этой главе.
В состав BDE входят следующие функциональные подсистемы.
Администратор системных ресурсов управляет процессом подключения к данным — при необходимости устанавливает нужные драйверы, а при завершении работы автоматически освобождает занятые ресурсы. Поэтому BDE всегда использует ровно столько ресурсов, сколько необходимо.
Система обработки запросов обеспечивает выполнение запросов SQL или QBE от приложения к любым базам данньк, для которых установлен драйвер, даже если сама СУБД не поддерживает прямое использование запросов SQL.
Система сортировки является запатентованной технологией и обеспечивает очень быстрый поиск по запросам SQL и через стандартные драйверы для Paradox и dBASE.
Система пакетной обработки представляет собой механизм преобразования данных из одного формата в другой при выполнении операций над целыми таблицами. Эта система использована в качестве основы для компонента TBatchMove и утилиты Data Pump (автоматического переноса структур данных между базами данных), входящей в стандартную поставку BDE.
Менеджер буфера управляет единой для всех драйверов буферной областью памяти, которую одновременно могут использовать несколько драйверов. Это позволяет существенно экономить системные ресурсы.
Менеджер памяти взаимодействует с ОС и обеспечивает эффективное использование выделяемой памяти. Ускоряет работу драйверов, которые для получения небольших фрагментов памяти обращаются к нему, а не к ОС. Дело в том, что менеджер памяти выделяет большие объемы оперативной памяти и затем распределяет ее небольшими кусками между драйверами согласно их потребностям.
Транслятор данных обеспечивает преобразование форматов данных для различных типов БД.
Кэш BLOB используется для ускорения работы с данными в формате BLOB. SQL-генератор транслирует запросы из формата QBE в SQL.
Система реструктуризации обеспечивает преобразование наборов данных в таблицы Paradox или dBASE.
Система поддержки драйверов SQL повышает эффективность механизма поиска при выполнении запросов SQL.
Таблицы в памяти. Этот механизм позволяет создавать таблицы непосредственно в оперативной памяти. Используется для ускорения обработки больших массивов данных, сортировки, преобразования форматов данных.
Связанные курсоры обеспечивают низкоуровневое выполнение межтабличных соединений. Позволяют разработчику не задумываться над реализацией подобных связей при работе на уровне VCL — для этого достаточно установить значения нескольких свойств.
Менеджер конфигурации обеспечивает разработчику доступ к информации о конфигурации драйверов.
Перечисленные функции реализованы в динамических библиотеках, которые, собственно, и называются процессором БД (табл. 14.1).
Таблица 14.1. Ядро процессора баз данных ВОЕ 5
Имя файла |
Назначение |
IDAPI32.DLL |
Базовая динамическая библиотека BDE |
IDPROV.DLL |
Динамическая библиотека, отвечающая за работу серверной части приложения |
BLW32.DLL |
Динамическая библиотека, обеспечивающая поддержку драйверов национальных языков |
IDBAT32.DLL |
Динамическая библиотека с функциями межтабличного переноса данных |
IDQBE32.DLL |
Динамическая библиотека, обеспечивающая работу запросов по примеру (Query By Example, QBE) |
1DSQL32.DLL |
Динамическая библиотека, обеспечивающая обработку запросов SQL |
IDASCI32.DLL |
Динамическая библиотека, обеспечивающая работу драйвера текстовых файлов |
IDPDX32.DLL |
Динамическая библиотека, обеспечивающая работу драйвера Paradox |
IDDBAS32.DLL |
Динамическая библиотека, обеспечивающая работу драйвера dBASE |
DODBC32.DLL |
Динамическая библиотека, обеспечивающая работу драйвера сокета ODBC |
IDR20009.DLL |
Динамическая библиотека ресурсов, содержащая сообщения об ошибках |
IDDA032.DLL |
Динамическая библиотека, обеспечивающая работу драйвера Microsoft Access 95 и Jet Engine 3.0 |
IDDA3532.DLL |
Динамическая библиотека, обеспечивающая работу драйвера Microsoft Access 97 и Jet Engine 3.5 |
IDDR32.DLL |
Динамическая библиотека для работы с репозиторием данных |
Кроме этого, имеется шесть дополнительных DLL, обеспечивающих работу BDE с серверами Oracle и Microsoft SQL Server.
Псевдонимы баз данных и настройка BDE
Для успешного доступа к данным приложение и BDE должны обладать информацией о местоположении файлов требуемой базы данных. Задание маршрута входит в обязанности разработчика.
Самый простой способ заключается в явном задании полного пути к каталогу, в котором хранятся файлы БД. Но в случае изменения пути, что случается не так уж редко (например, при переносе готового приложения на компьютер заказчика), разработчик должен перекомпилировать проект с учетом будущего местонахождения БД или предусмотреть специальные элементы управления, в которых можно задать путь к БД.
Для решения такого рода проблем разработчик может использовать псевдоним базы данных, который представляет собой именованную структуру, содержащую путь к файлам БД и некоторые дополнительные параметры. В первом приближении можно сказать, что вы просто присваиваете маршруту произвольное имя, которое используется в приложении. Тогда при переносе приложения на компьютере заказчика достаточно создать стандартными средствами BDE одноименный псевдоним и настроить его на нужный каталог. При этом само приложение не требует переделок, так как оно обращается к псевдониму с одним именем, а вот BDE уже "знает", куда отправить запрос приложения, использовавшего этот псевдоним.
Помимо маршрута к файлам базы данных, псевдоним BDE обязательно содержит информацию о драйвере БД, который используется для доступа к данным. Наличие других параметров зависит от типа драйвера, а значит от типа СУБД.
Для управления псевдонимами баз данных, настройки стандартных и дополнительных драйверов в составе BDE имеется специальная утилита -BDE Administrator (исполняемый файл BDEADMIN.EXE).
Стандартная конфигурация BDE сохраняется в файле IDAP1.CFG. При необходимости текущую конфигурацию можно сохранить в новом файле с расширением CFG или загрузить заново при помощи команд Save As Configuration и Open Configuration из меню Object.
В верхней части окна утилиты расположена панель инструментов, кнопки которой используются при работе с конкретным элементом настройки BDE.
Рабочая область утилиты BDE Administrator представляет собой двухстраничный блокнот.
Страница Databases содержит иерархическое дерево, в узлах которого расположены установленные в системе на данный момент псевдонимы БД (рис. 14.2). При выборе какого-либо псевдонима в правой части панели появляется путь к файлам базы данных и перечень параметров драйвера, соответствующего псевдониму, которые можно настраивать вручную.
Рис. 14.2. Окно утилиты ВОЕ Administrator с открытой страницей Databases
Рис. 14.3. Окно утилиты BDE Administrator с открытой страницей Configuration
Страница Configuration используется для настройки параметров драйверов BDE, предназначенных для обеспечения доступа к локальным СУБД и серверам БД (рис. 14.3). Также здесь определяется системная конфигурация BDE. которая включает параметры числовых форматов, дат, времени. Вся информация на этой странице также структурирована в виде иерархического дерева.
При выборе в левой панели утилиты какого-либо узла, в правой части на странице Definition отображается вся необходимая информация для этого объекта.
Сохранение изменений осуществляется при помощи команд меню Object, всплывающего меню или при перемещении на другой псевдоним.
Для создания нового псевдонима требуется выбрать команду New из меню Object или из всплывающего меню узла Databases на одноименной странице. Затем в появившемся простом диалоге задается необходимый драйвер.
Отметим, что один из четырех стандартных локальных драйверов устанавливается на странице Configuration в качестве предопределенного, поэтому в списке он доступен под названием STANDARD, а остальные не видны вообще. Из драйверов SQL Links доступны те, которые были установлены при инсталляции Delphi или позже.
Кроме того, в списке можно выбрать один из драйверов ODBC, установка которых осуществляется стандартными системными средствами в Панели управления Windows.
После выбора драйвера в дереве псевдонимов БД появляется новый узел, для драйвера которого требуется установить необходимые параметры (см. ниже).
Для четырех локальных драйверов список параметров в правой части панели утилиты на странице Definition ограничивается параметрами стандартного драйвера (STANDARD), подробная настройка для каждого драйвера осуществляется на странице Configuration.
Назначение параметров локальных драйверов BDE (Paradox, dBASE, FoxPro, ASCII) представлено в табл. 14.2.
Таблица 14.2. Параметры драйверов BDE для локальных баз данных
Параметр |
Назначение |
STANDARD |
|
DEFAULT DRIVER |
Задает тип конкретного локального драйвера (Paradox, dBASE, FoxPro, ASCII) |
ENABLE BCD |
Определяет способ представления вещественных чисел. При значении True такие числа преобразуются в формат BCD (Binary Coded Decimals — десятичные с двоичным кодированием). Точность составляет 20 знаков после запятой |
PATH |
Указывает путь к файлам базы данных |
PARADOX |
|
NET DIR |
Указывает путь к файлу обеспечения сетевого доступа к БД PDOXUSRS.NET. Драйвер приложения, которое работаете БД локально, должен указывать на этот файл, расположенный на том же компьютере. Драйвер приложения, обращающегося к БД по сети, должен указывать на подключенный сетевой диск с этим файлом |
VERSION |
Не редактируемая информация о версии драйвера |
TYPE |
Тип СУБД. Для Paradox имеет значение file. Только для чтения. |
LANGDRIVER |
Определяет драйвер языковой поддержки (используйте драйвер Paradox Cyrr 866) |
BLOCK SIZE |
Задает размер блоков дискового пространства для хранения записей, кратный 1024 |
FILL FACTOR |
Определяет процент заполнения блока дискового пространства при хранении индексов, по умолчанию 95% |
LEVEL |
Задает формат временной таблицы в памяти: 3 — совместим с Paradox 3.5 и ниже 4 — Paradox 4.0 5 - Paradox 5.0 7 - Paradox для WIN32 |
STRICTINTEGRTY |
Определяет возможность использования приложениями на базе Paradox 4.0 более поздних таблиц со ссылочной целостностью. При значении True использование разрешается, но возникает риск нарушения*целостности данных |
DBASE |
|
VERSION |
Не редактируемая информация о версии драйвера |
TYPE |
Тип СУБД. Для dBASE имеет значение file. Только для чтения |
LANGDRIVER |
Определяет драйвер языковой поддержки (используйте драйвер dBASE RUS ср866) |
LEVEL |
Задает формат таблиц. Значение соответствует номеру версии СУБД |
MDX BLOCK SIZE |
Размер блоков для файлов с расширением MDX, кратный 512 |
DBASE |
|
MEMO FILE BLOCK SIZE |
Размер блоков для файлов с данными типа Memo (расширение DBT), кратный 512 |
FOXPRO |
|
VERSION |
Не редактируемая информация о версии драйвера |
TYPE |
Тип СУБД. Для FoxPro имеет значение file. Только для чтения. |
LANGDRIVER |
Определяет драйвер языковой поддержки |
LEVEL |
Имеет значение 25 |
Драйвер текстовых файлов ASCIIDRV имеет параметры стандартного драйвера.
Назначение параметров драйверов SQL Links для серверов SQL представлено в табл. 14.3. Сначала приведены параметры, которые встречаются в двух и более драйверах, затем уникальные для каждого драйвера параметры. Драйверы для серверов InterBase и Sybase не представлены, так как содержат только общие для двух серверов параметры.
Таблица 14.3. Параметры драйверов ВОЕ для серверов SQL
Параметр |
Назначение |
|
Общие параметры (встречаются как минимум у двух драйверов) |
||
VERSION |
He редактируемая информация о версии драйвера |
|
TYPE |
Тип СУБД. Только для чтения |
|
DLL |
Название библиотеки динамического связывания SQL Links для 16-разрядного драйвера. Только для чтения. |
|
DLL32 |
Название библиотеки динамического связывания SQL Links для 32-разрядного драйвера. Только для чтения. |
|
DRIVER FLAGS |
Используется только при необходимости применения старых версий драйвера, где не поддерживается уровень изоляции транзакций Read Committed. Для этого необходимо установить значение 512. |
|
TRACE MODE |
Содержит битовую маску, которая определяет тип выдаваемой отладочной информации |
|
BATCH COUNT |
Задает число записей, модифицируемых в одном пакете при фиксации транзакций. |
BLOB SIZE |
Размер кэша для данных типа BLOB. Диапазон от 32Кбайт до 1000 Кбайт. |
|
blobs то cache |
Задает число кэшируемых записей с данными BLOB. Диапазон от 64 до 65536 |
|
enable BCD |
Определяет способ представления вещественных чисел. При значении True такие числа преобразуются в формат BCD (Binary Coded Decimals — десятичные с двоичным кодированием), который позволяет округлять погрешности высших разрядов дробной части числа. Изменение параметра для псевдонима работает, только если параметр драйвера на странице Configuration не пустой |
|
enable schema сасне |
Определяет режим кэширования структуры данных. При значении True структура таблиц БД кэшируется локально в каталоге, задаваемом параметром schema cache dir. Рекомендуется использовать только для баз данных с постоянной структурой |
|
langdriver |
Определяет драйвер языковой поддержки |
|
мах rows |
Ограничивает максимальное число записей, которое может быть передано клиенту в ответ на запрос. Значение по умолчанию — -1 (ограничений нет) |
|
open mode |
Режим работы с записями БД: READ/WRITE — полный доступ read only — только чтение |
|
schema cache dir |
Каталог для локального кэширования структуры данных (см. параметр enable schema cache) |
|
schema cache size |
Задает число таблиц, структура данных которых может кэшироваться |
|
schema cache TIME |
Задает время хранения кэшируемой структуры данных: -1 — время не ограничено 0 — данные не кэшируются 1-2147483647 время в секундах |
|
server name |
Указывает путь к таблицам БД (это может быть локальный маршрут ИЛИ маршрут с указанием удаленного сервера БД) |
|
sqlpassthru mode |
Задает способ разделения соединения с сервером между прямыми запросами SQL и запросами, управляемыми пользователем. shared autocommit — соединение используется совместно и прямые запросы фиксируются автоматически shared NO autocommit — соединение используется совместно и прямые запросы фиксируются сервером самостоятельно not shared — совместное использование запрещено. |
|
sqlqrymode |
Задает режим управления запросами: null — сначала запрос передается серверу, и если тот не может обработать его, запрос выполняется локально server — запрос передается серверу local — запрос выполняется локально |
|
vendor init |
Название файла динамической библиотеки поставщика. |
|
connect timeout |
Определяет временной интервал, после которого клиент попытается восстановить прерванную связь с сервером |
|
Time out |
Задает время ожидания ответа сервера на запрос |
|
blob edit LOGGING |
Управляет механизмом сохранения всех изменений для полей типа BLOB. При значении True изменения сохраняются. |
|
DATABASE NAME |
Имя базы данных |
|
мах query time |
Задает максимальное время ожидания ответа на запрос |
|
user name |
Имя пользователя, которое используется сервером при подключении |
|
Microsoft SQL Server (MSSQL) |
||
max dbprocesses |
Максимальное число процессов, одновременно работающих в данном соединении |
|
application name |
Имя приложения, помогающее серверу идентифицировать процессы |
|
date mode |
Определяет формат даты: 0-МДГ 1 -ДМГ 2 - ГМД |
|
HOST NAME |
Содержит имя рабочей станции. Помогает серверу при идентификации процессов |
|
NATIONAL LANG NAME |
Задает национальный язык, который используется для вывода текста в сообщениях об ошибках |
|
TDS PACKET SIZE |
Определяет размер пакетов потоков данных |
|
Oracle (ORACLE) |
||
NET PROTOCOL |
Устанавливает сетевой протокол передачи данных |
|
Informix (INFORMIX) |
||
DATE SEPARATOR |
Задает разделитель для формата даты |
|
Microsoft Access (MSACCESS) |
||
system database |
Путь к системной базе данных с информацией о правах доступа. При изменении параметра драйвер необходимо перезагрузить |
|
DB2 (DB2) |
||
DB2 DSN |
Задает имя соединения с БД. Это название псевдонима клиента DB2, который создается на сервере |
|
DRIVER |
Имя драйвера DB2 |
|
ROWSET SIZE |
Определяет число записей, передаваемых одновременно |
|
Драйверы ODBC |
||
ODBC DRIVER |
Имя драйвера ODBC |
|
ODBC DSN |
Имя набора данных ODBC |
После настройки параметров драйвера и сохранения текущей конфигурации новый псевдоним становится доступен для любого приложения, использующего BDE. Подробнее о настройке компонентов доступа к данным приложений БД см. следующую главу.
Страница Configuration, помимо настройки установленных в BDE драйверов, позволяет редактировать параметры, используемые BDE при инициализации приложения. Эти параметры доступны при выборе узлов System, а затем INIT иерархического дерева. Назначение параметров представлено в табл. 14.4.
Таблица 14.4. Параметры инициализации приложения
Параметр |
Назначение |
AUTO ODBC
|
В значении True при каждой инициализации в BDE автоматически импортируются все установленные в системе драйверы ODBC |
DATA REPOSITORY |
Имя текущего словаря данных |
DEFAULT DRIVER |
Локальный драйвер, используемый по умолчанию в драйвере STANDARD |
LANGDRIVER
|
Драйвер языковой поддержки. При использовании стандартных локальных драйверов это значение перекрывает те, которые определены епосредственно в конфигурациях драйверов Paradox, dBASE, FoxPro, ASCII |
LOCAL SHARE
|
Устанавливает режим совместного использования файлов приложениями, работающими через BDE и другими программами. В значении True совместное использование разрешено. |
LOW MEMORY USAGE LIMIT |
Максимальный объем памяти (в килобайтах), который BDE пытается использовать в первом мегабайте оперативной памяти |
MAXBUFSIZE |
Максимальный размер кэша данных. Он должен быть не меньше значения параметра minbufsize и кратен 128 |
MAXFILEHANDLES |
Максимальное число используемых файлов |
MEMSIZE |
Максимальный объем используемой BDE памяти в мега байтах |
MINBUFSIZE |
Минимальный размер кэша данных. Он должен быть не больше значения параметра maxbufsize и кратен 128 |
MTS POOLING
|
Управляет режимом объединения ресурсов MTS (Microsoft Transaction Server). Обеспечивает лучшую производительность |
SHAREDMEMLOCATION
|
Содержит адрес памяти, который пытаются использовать Менеджер памяти и Менеджер буфера. При возникновении конфликтов адрес необходимо поменять вручную. Задает ся только второе слово адреса. |
SHAREDMEMSIZE |
Максимальный объем памяти, используемый Менеджером памяти и Менеджером буфера |
SQLQRYMODE |
См. таблицу 15.2 |
SYSFLAGS |
Не используется |
VERSION |
Номер внутренней версии BDE. Только для чтения |
Также на странице Configuration устанавливаются параметры форматов даты, времени и чисел. Доступ к параметрам осуществляется через узлы System и Format.
Интерфейс прикладных программ и BDE
Как уже говорилось выше, любое приложение Delphi, работающее с базами данных и написанное с использованием стандартных компонентов доступа к данным, обращается к данным и получает результат при помощи BDE. При этом механизм доступа к данным использует вызовы функции из API BDE.
Достаточно сложно представить себе такую ситуацию, когда возникает необходимость создания приложения, использующего только функции BDE, без применения компонентов доступа к данным VCL. А вот отдельные функции вполне могут понадобиться в любой программе. Поэтому рассмотрим процесс работы приложения, использующего вызовы BDE, так как это дает хорошую возможность понять механизм доступа к данным, который реализован в Delphi.
Итак, для создания приложения на основе вызовов функций BDE необходимо выполнить следующие операции.
При использовании в программе функций из API BDE необходимо включить в секцию uses модуль BDE.
В прикладном программировании задачи, которые требовали бы выполнения всех описанных выше операций, практически не встречаются. Между тем, включение в программный код отдельных функций API BDE оправдано. В качестве примера рассмотрим приложение, которое позволяет очистить таблицу базы данных.
Дело в том, что при удалении записи из таблицы локальной СУБД (например, Paradox) размер файла таблицы остается прежним, даже если удалить все записи. То есть на самом деле запись не удаляется, а только становится недоступной. При интенсивном использовании базы данных файлы таблиц могут занимать значительные объемы дискового пространства при довольно умеренном числе записей.
Рис. 14.4. Главная форма проекта BDEEmptyTable
Полная очистка таблиц базы данных осуществляется функцией DbiEmptyTabie из API BDE. Именно она используется в демонстрационном приложении для радикального уменьшения размера таблиц (рис. 14.4).
Функция DbiEmptyTabie используется в методе EmptyTable компонентов доступа к данным (см. следующую главу).
В листинге 14.1. приведен исходный код этого приложения. Помимо указанной функции, в нем используются функции создания списка параметров доступных баз данных и таблиц текущей базы данных.
Листинг 14.1. Модуль главной формы приложения ВОЕЕmptyTable
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtris, BDE, ExtCtrls, DBCtrls, Grids, DBGrids, Db, DBTables, Buttons;
type
TMainForm = class(TForm)
AliasesList: TComboBox;
TablesList: TComboBox;
EmptyBtn: TBitBtn;
Label1: Tlabe1;
Label2: Tlabe1;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure AliasesListChange(Sender: TObject);
procedure EmptyBtnClick(Sender: TObject);
private
hDB: hDBIDB;
hCursor: hDBICur;
DBDesc: DBDesc;
TbXDesc : TBLBaseDesc;
public
{Public declarations } end;
var
MainForm: TMainForm;
implementation ($R *.DFM)
procedure TMainForm.FormShow(Sender: TObject);
var Rsit: DBIResult; begin
AliasesList.Items.Clear;
TablesList.Items.Clear;
hDB := Nil;
try
Dbilnit(Nil);
// Инициализация BDE
DbiOpenDatabaseList(hCursor) ;
repeat
Rslt:= DbiGetNextRecordfhCursor, dbiNOLOCK, @DBDesc, nil);
if (Rsit <> DBIERR_EOF) then AliasesList.Items.Add(StrPas(DBDesc.szName));
until (rsit <> DBIERR_NONE);
DbiCloseCursor(hCursor);
except
on E:EDBEngineError do ShowMessage('Ошибка инициализации BDE');
end;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin try finally
if hDB Nil then DbiCloseDatabase(hDB);
// Закрытие базы данных
DbiExit;
// Закрытие сеанса работы с BDE
end
end;
procedure TMainForm.AliasesListChange(Sender: TObject);
begin try
if hDB <> Nil
then DbiCloseDatabase(hDB);
// Закрытие базы данных
DbiOpenDatabase
// Открытие базы данных
(
PChar(AliasesList.Text), // Псевдоним базы данных
Nil, // Тип базы данных
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
Nil, // Пароль
О, // Число дополнительных параметров
Nil, // Перечень полей для доп. параметров
Nil, // Список доп. параметров
hDB // Дескриптор базы данных ) ;
DbiSetPrivateDir('с:\temp');// Определение временного каталога
DbiOpenTableList(hDb, False, False, '*.DB', hCursor);
TablesList.Items.Clear;
TablesList.Clear;
while DbiGetNextRecord(hCursor, dbiNOLOCK, @TblDesc, nil) = dbiErr_None do TablesList.Items.Add(TblDesc.szName);
DbiCloseCursor(hCursor);
except
on E:EDBEngineError do ShowMessage('Ошибка открытия базы данных');
end;
end;
procedure TMainForm.EmptyBtnClick(Sender: TObject) ;
begin
try
DbiEmptyTable(hDB, Nil, PChar(TablesList.Text),");
except on E:EDBEngineError do ShowMessage('Неверно задана таблица');
end;
end;
end.
При открытии главной формы (метод-обработчик FormShow) функция Dbiinit осуществляет инициализацию BDE. Затем функция DbiOpenDatabaseList создает в памяти временную таблицу, в которую записываются характеристики каждой зарегистрированной базы данных. Для этого применяется структура DBDesc. Курсор hCursor обеспечивает доступ к записям о базах данных.
После этого функция DbiGetNextRecord позволяет осуществить последовательное считывание имен псевдонимов баз данных (для этого в параметре передается указатель на структуру DBDesc) и их запись в список компонента AliasesList типа TComboBox.
При выборе из этого списка конкретного псевдонима работает метод-обработчик AliasesListChange. В нем открывается соответствующая база данных (функция DbiOpenDatabase), доступ к которой в дальнейшем осуще-ствляется через дескриптор hDB.
Функция DbiOpenTableList создает временную таблицу в памяти, в которую помещаются данные о таблицах выбранной базы данных в соответствии с форматом структуры ТВLВазеОеsс. Функция DbiGetMextRecord позволяет передать эту информацию в список компонента TablesList типа TComboBox.
При щелчке на кнопке EmptyBtn в методе-обработчике EmptyBtnciick работает функция DbiEmptyTable, которая очищает выбранную ранее в компоненте TablesList таблицу.
Обратите внимание на операторы try. . .except, позволяющие реализовать обработку возможных исключительных ситуаций.
Рис. 14.5. Главная форма проекта DirectBDE
Теперь рассмотрим пример простейшего приложения, которое может отображать два поля из таблицы COUNTRY. DB в демонстрационной базе данных DBDEMOS. Эта база данных поставляется в комплекте Delphi. В примере использованы только функции API BDE.
Проект называется DirectBDE и имеет только одну форму, в которой отображаются сведения из таблицы COUNTRY.DB о государствах и их столицах (рис. 14.5). Кнопки в нижней части формы позволяют перемещаться по набору данных.
Листинг 14.2. Модуль главной формы приложения DirectBDE
unit Uniti;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, BDE, ExtCtrls;
type
TMainForm = class(TForm)
PriorBtn: TBitBtn;
Panel2: TPanel;
NextBtn: TBitBtn;
Label3: TLabel;
CountryEdit: TEdit;
Labell: TLabel;
CapitalEdit: TEdit;
procedure PriorBtnClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure NextBtnClick(Sender: TObject);
private
hDB: hDBIDB;
hCur: hDBICur;
CursProps: CurProps;
RecBuf: pByte;
FValue: array[0..255] of Char;
IsEmpty: Bool;
procedure OnBDEError;
public end;
var
MainForm: TMainForm;
implementation {$R *.DFM}
procedure TMainForm.OnBDBError;
var Errlnfo: dbiErrInfo; //Структура, содержащая информацию об ошибках AStr: String;
begin
DbiGetErrorInfo(True, Errlnfo);//Функция возвращает информацию об ошибке
case ErrInfo.iError of
9733: AStr := 'Для создания записи недостаточно параметров';
10024: AStr := 'Ошибка доступа к данным';
10245: AStr := 'База данных занята другим пользователем';
10038: AStr := 'Значение поля задано неверно';
11871: AStr := 'Несоответствие типов';
11959: AStr := 'В выражении отсутствует оператор GROUP BY';
else
AStr := 'Ошибочная операция с данными';
end;
ShowMessage(AStr);
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
hDB := Nil;
hCur := Nil;
Dbilnit(Nil); // Инициализация системы BDE
DbiOpenDatabase // Открытие базы данных
(
'DBDEMOS', // Псевдоним базы данных
Nil, // Тип базы данных
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
Nil, // Пароль
О, // Число дополнительных параметров
Nil, // Перечень полей для доп. параметров
Nil, // Список доп. параметров
hDB // Дескриптор базы данньи
);
DbiSetPrivateDir('с:\temp'); // Определение временного каталога
DbiOpenTable // Открытие таблицы
(
hDB, // Дескриптор базы данных
PCharf'COUNTRY'), // Название таблицы
PChar(szParadox), // Тип таблицы (только для локальных БД)
Nil, // Название индекса (необязательный)
Nil, // IndexTagName — только для dBASE
О, // 0 — использовать первичный индекс
dbiReadWrite, // Режим редактирования данных
dbiOpenShared, // Режим разделения данных
xltField, // Режим трансляции данных
False, // Признак одностороннего перемещения курсора
Nil, // Дополнительные параметры
hCur // Дескриптор курсора таблицы
) ;
DbiGetCursorProps // Определение параметров курсора
(
hCur, // Дескриптор курсора таблицы
Curs Props // Структура параметров курсора );
GetMem // Выделение памяти под буфер записи (
RecBuf,
CursProps.iRecbuf3ize*SizeOf(Byte) );
DbiSetToBegin(hCur); // Установка курсора в начало набора данных
DbiGetNextRecord // Перемещение на первую запись (
hCur, // Дескриптор курсора таблицы
dbiNoLock, // Режим ограничения доступа
RecBuf, // Буфер записи
Nil // Параметры записи );
DbiGetField // Получение значения поля (
hCur, // Дескриптор курсора таблицы
1, // Номер поля в структуре таблицы
RecBuf, // Буфер записи
@FValue, // Переменная, в которую передается значение
IsEmpty // Признак пустой ячейки );
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, OFValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction begin try finally
FreeMem(RecBuf); // Освобождение памяти буфера записи DbiCloseCursor(hCur); // Закрытие курсора
DbiCloseDatabase(hDB);
// Закрытие базы данных DbiExit;
// Закрытие сеанса работы с BDE
end end; procedure TMainForm.PriorBtnClick(Sender: TObject);
begin try
if DbiGetPriorRecord(hCur, dbiNoLock, RecBuf, Nil) = DBIERR_BOF then PriorBtn.Enabled := False else
begin
if Not NextBtn.Enabled then NextBtn.Enabled := True;
DbiGetFieldfhCur, 1, RecBuf, @FValue, IsEmpty);
MainForm.CountryEdit.Text := FValue;
DbiGetField(hCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
except OnBDEError;
end;
end;
procedure TMainForm.NextBtnClick(Sender: TObject);
begin
try
if DbiGetNextRecord(hCur, dbiNoLock, RecBuf, Nil)=DBIERR_EOF then NextBtn.Enabled := False else
begin
if Not PriorBtn.Enabled then PriorBtn.Enabled := True;
DbiGetFieldfhCur, 1, RecBuf, @FValue, IsEmpty);
MainForm.CountryEdit.Text := FValue;
DbiGetFieldfhCur, 2, RecBuf, @FValue, IsEmpty);
MainForm.CapitalEdit.Text := FValue;
end;
except OnBDEError;
end;
end;
end.
При показе главной формы приложения в процедуре Formshow проводится инициализация BDE, открытие базы данных и таблицы. При этом создаются дескрипторы базы данных hDB и курсора таблицы hCur, которые играют в дальнейшей работе приложения важную роль. Если при создании базы данных не указывать псевдоним БД, то затем обязательно нужно определить рабочий каталог базы данных с помощью функции DbiSetDirectory.
После этого отводится память под буфер записи, в который будут передаваться значения полей текущей строки таблицы. Размер буфера определяется при помощи структуры CURPropS.
Затем курсор устанавливается на начало набора данных и на первую запись и осуществляется чтение значений двух полей таблицы.
Навигация по набору данных реализована в методах-обработчиках на нажатие кнопок формы. Их действия аналогичны за исключением направления перемещения. При щелчке на кнопке осуществляется переход на следующую или предыдущую запись, данные из новой записи помещаются в буфер записи RecBuf. Оттуда при помощи функции DbiGetField осуществляется чтение значений полей. При достижении начала или конца набора данных кнопка деактивируется.
При закрытии формы проводятся операции по освобождению памяти буфера записи и закрытию базы данных и BDE.
Резюме
Приложения баз данных используют для обращения к локальным базам и серверам специальное программное обеспечение. В Delphi для этого предназначен процессор баз данных Borland Database Engine 5. Он реализует стандартные функции доступа к данным и является ПО промежуточного слоя между приложением и базой данных. При помощи системы драйверов и псевдонимов BDE обеспечивает универсальный способ доступа к данным.
Стандартные компоненты доступа к данным Delphi используют BDE. Но при необходимости разработчик может использовать функции API BDE напрямую.
Материал о доступе к данным содержится также: