Создание баз
данных в Delphi
Урок
1:
Настройка BDE
Содержание
урока 1:
Обзор 2
Сущность
BDE 2
Алиасы 2
Системная
информация
утилиты настройки
BDE 4
Заключение 5
Обзор
На этом уроке
мы познакомимся
с ядром баз
данных компании
Борланд - Borland
Database Engine (BDE), а также
научимся создавать
и редактировать
алиасы - механизм,
облегчающий
связь с базами
данных. Кроме
того, мы изучим,
как конфигурировать
ODBC драйверы.
Сущность
BDE
Мощность и
гибкость Delphi при
работе с базами
данных основана
на низкоуровневом
ядре - процессоре
баз данных
Borland Database Engine (BDE). Его интерфейс
с прикладными
программами
называется
Integrated Database Application Programming Interface (IDAPI). В
принципе, сейчас
не различают
эти два названия
(BDE и IDAPI) и считают
их синонимами.
BDE позволяет
осуществлять
доступ к данным
как с использованием
традиционного
record-ориентированного
(навигационного)
подхода, так
и с использованием
set-ориентированного
подхода, используемого
в SQL-серверах
баз данных.
Кроме BDE, Delphi позволяет
осуществлять
доступ к базам
данных, используя
технологию
(и, соответственно,
драйверы) Open
DataBase Connectivity (ODBC) фирмы
Microsoft. Но, как показывает
практика,
производительность
систем с использованием
BDE гораздо выше,
чем оных при
использовании
ODBC. ODBC драйвера
работают через
специальный
“ODBC socket”, который
позволяет
встраивать
их в BDE.
Все инструментальные
средства баз
данных Borland
- Paradox, dBase, Database Desktop - используют
BDE. Все особенности,
имеющиеся в
Paradox или dBase, “наследуются”
BDE, и поэтому этими
же особенностями
обладает и
Delphi.
Алиасы
Таблицы сохраняются
в базе данных.
Некоторые СУБД
сохраняют базу
данных в виде
нескольких
отдельных
файлов, представляющих
собой таблицы
(в основном,
все локальные
СУБД), в то время
как другие
состоят из
одного файла,
который содержит
в себе все таблицы
и индексы
(InterBase). Например,
таблицы dBase и
Paradox всегда сохраняются
в отдельных
файлах на диске.
Каталог, содержащий
dBase .DBF файлы или
Paradox .DB файлы,
рассматривается
как база данных.
Другими словами,
любой каталог,
содержащий
файлы в формате
Paradox или dBase, рассматривается
Delphi как единая
база данных.
Для переключения
на другую базу
данных нужно
просто переключиться
на другой каталог.
Как уже было
указано выше,
InterBase сохраняет
все таблицы
в одном файле,
имеющем расширение
.GDB, поэтому этот
файл и есть
база данных
InterBase.
Удобно не просто
указывать путь
доступа к таблицам
базы данных,
а использовать
для этого некий
заменитель
- псевдоним,
называемый
алиасом. Он
сохраняется
в отдельном
конфигурационном
файле в произвольном
месте на диске
и позволяет
исключить из
программы
прямое указание
пути доступа
к базе данных.
Такой подход
дает возможность
располагать
данные в любом
месте, не перекомпилируя
при этом программу.
Кроме пути
доступа, в алиасе
указываются
тип базы данных,
языковый драйвер
и много другой
управляющей
информации.
Поэтому использование
алиасов позволяет
легко переходить
от локальных
баз данных к
SQL-серверным
базам (естественно,
при выполнении
требований
разделения
приложения
на клиентскую
и серверную
части).
Для создания
алиаса запустите
утилиту конфигурации
BDE (программу
bdeadmin.exe), находящуюся
в каталоге, в
котором располагаются
динамические
библиотеки
BDE.
Рис. 1: Главное
окно утилиты
конфигурации
BDE
Главное
окно утилиты
настройки BDE
имеет вид,
изображенный
на рис.1. Для
создания алиаса
выберите в меню
“Object” пункт
“New”. В появившемся
диалоговом
окне выберите
имя драйвера
базы данных.
Тип алиаса
может быть
стандартным
(STANDARD) для работы
с локальными
базами в формате
dBase или Paradox или
соответствовать
наименованию
SQL-сервера (InterBase,
Sybase, Informix, Oracle и т.д.).
Рис.
2: В диалоговом
окне добавления
нового алиаса
можно указать
тип базы данных
После создания
нового алиаса
следует дать
ему имя. Это
можно сделать
с помощью подпункта
“Rename” меню
“Object”. Однако
просто создать
алиас не достаточно.
Вам нужно указать
дополнительную
информацию,
содержание
которой зависит
от типа выбранной
базы данных.
Например, для
баз данных
Paradox и dBase (STANDARD) требуется
указать лишь
путь доступа
к данным, имя
драйвера и флаг
ENABLE BCD, который
определяет,
транслирует
ли BDE числа
в двоично-десятичном
формате (значения
двоично-десятичного
кода устраняют
ошибки округления):
TYPE
|
STANDARD
|
DEFAULT
DRIVER
|
PARADOX
|
ENABLE
BCD
|
FALSE
|
PATH
|
c:\users\data
|
SQL-сервер InterBase и
другие типы
баз данных
требуют задания
большого количества
параметров,
многие из которых
можно оставить
установленными
по умолчанию.
Системная
информация
утилиты настройки
BDE
Итак, мы познакомились
с наиболее
важной возможностью
утилиты настройки
BDE - созданием
и редактированием
алиасов, определяющих
параметры
доступа к базам
данных. Однако,
утилита настройки
BDE позволяет
специфицировать
не только алиасы,
но и драйверы
для доступа
к базам данных,
а также различную
системную
информацию,
составляющую
операционное
окружение этих
самых алиасов.
Рассмотрим,
например, системную
информацию
драйвера PARADOX:
NET DIR. Параметр
содержит
расположение
каталога сетевого
управляющего
файла. Он нужен
для того, чтобы
обратиться
к таблице PARADOX
на сетевом
диске.
VERSION. Номер
версии драйвера.
TYPE. Тип драйвера.
LANGDRIVER. Языковой
драйвер, определяющий
множество
допустимых
символов.
BLOCK SIZE. Размер
блока на диске,
используемого
для запоминания
одной записи.
FILL FACTOR. Содержит
процент от
блока на текущем
диске. Параметр
нужен для создания
индексных
файлов.
LEVEL. Параметр
определяет
тип формата
таблицы, используемой
для создания
временных
таблиц.
STRICTINTEGRTY. Параметр
использования
ссылочной
целостности.
Если он равен
TRUE, то вы не можете
изменить таблицу
с ссылочной
целостностью,
а если FALSE, то можете,
но рискуете
нарушить целостность
данных.
Как уже отмечалось
выше, утилита
настройки BDE
сохраняет всю
конфигурационную
информацию
в файле IDAPI.CFG. Этот
файл с предустановленными
ссылками на
драйверы и
некоторыми
стандартными
алиасами создается
при установке
Delphi. Кроме того,
он создается
при установке
файлов редистрибуции
BDE (т.е. когда Вы
переносите
BDE и SQL Links на другие
компьютеры).
Заключение
Итак, на данном
уроке мы постарались
понять для, что
такое BDE,
изучили очень
важное для
работы с базами
данных понятие
- алиас, а также
научились
настраивать
его параметры
для корректной
работы программы
на примере
драйвера PARADOX.
Создание баз
данных в Delphi
Урок 2:
Создание таблиц
с помощью Database
Desktop
Содержание
урока 2:
Обзор 2
Утилита
Database Desktop 2
Заключение 9
Обзор
На данном уроке
мы изучим, как
создавать
таблицы базы
данных с помощью
утилиты Database Desktop,
входящей в
поставку Delphi. Хотя
для создания
таблиц можно
использовать
различные
средства (SQL -
компонент
TQuery
и компонент
TTable),
применение
этой утилиты
позволяет
создавать
таблицы в
интерактивном
режиме и сразу
же просмотреть
их содержимое
- и все это для
большого числа
форматов. Это
особенно удобно
для локальных
баз данных, в
частности
Paradox и dBase.
Утилита
Database Desktop
Database Desktop - это утилита,
во многом похожая
на Paradox, которая
поставляется
вместе с Delphi для
интерактивной
работы с таблицами
различных
форматов локальных
баз данных -
Paradox и dBase, а также
SQL-серверных
баз данных
InterBase, Oracle, Informix, Sybase (с использованием
SQL Links). Исполняемый
файл утилиты
называется
DBD32.EXE. Для запуска
Database Desktop просто дважды
щелкните по
ее иконке.
Рис. 1: Выпадающий
список в диалоговом
окне Table Type позволяет
выбрать тип
создаваемой
таблицы
После старта
Database Desktop выберите
команду меню
File|New|Table для создания
новой таблицы.
Перед Вами
появится диалоговое
окно выбора
типа таблицы,
как показано
на рис.1. Вы можете
выбрать любой
формат из
предложенного,
включая различные
версии одного
и того же формата.
После выбора
типа таблицы
Database Desktop представит
Вам диалоговое
окно, специфичное
для каждого
формата, в котором
Вы сможете
определить
поля таблицы
и их тип, как
показано на
рис.2.
Рис. 2: Database Desktop позволяет
задать имена
и типы полей
в таблице
Имя поля в таблице
формата Paradox
представляет
собой строку,
написание
которой подчиняется
следующим
правилам:
Имя должно
быть не длиннее
25 символов.
Имя не должно
начинаться
с пробела, однако
может содержать
пробелы. Однако,
если Вы предполагаете
в будущем переносить
базу данных
в другие форматы,
разумнее будет
избегать включения
пробелов в
название поля.
Фактически,
в целях переносимости
лучше ограничиться
девятью символами
в названии
поля, не включая
в него пробелы.
Имя не должно
содержать
квадратные,
круглые или
фигурные скобки
[], ()
или {},
тире, а также
комбинацию
символов “тире”
и “больше”
(->).
Имя не должно
быть только
символом #,
хотя этот символ
может присутствовать
в имени среди
других символов.
Хотя Paradox поддерживает
точку (.)
в названии
поля, лучше ее
избегать, поскольку
точка зарезервирована
в Delphi для других
целей.
Имя поля в таблице
формата dBase
представляет
собой строку,
написание
которой подчиняется
правилам, отличным
от Paradox:
Таким образом,
Вы видите, что
имена полей
в формате dBase
подчиняются
гораздо более
строгим правилам,
нежели таковые
в формате Paradox.
Однако, мы еще
раз хотим
подчеркнуть,
что если перед
Вами когда-либо
встанут вопросы
совместимости,
то лучше сразу
закладывать
эту совместимость
- давать полям
имена, подчиняющиеся
более строгим
правилам.
Укажем еще
правила, которым
подчиняется
написание имен
полей в формате
InterBase.
Имя должно
быть не длиннее
31 символа.
Имя должно
начинаться
с букв A-Z,
a-z.
Имя поля может
содержать
буквы (A-Z,
a-z),
цифры, знак $
и символ подчеркивания
(_).
Пробелы в имени
недопустимы.
Для имен таблиц
запрещается
использовать
зарезервированные
слова InterBase.
Следующий
(после выбора
имени поля) шаг
состоит в задании
типа поля. Типы
полей очень
сильно различаются
друг от друга,
в зависимости
от формата
таблицы. Для
получения
списка типов
полей перейдите
к столбцу “Type”,
а затем нажмите
пробел или
щелкните правой
кнопкой мышки.
Приведем списки
типов полей,
характерные
для форматов
Paradox, dBase и InterBase.
Итак, поля таблиц
формата Paradox могут
иметь следующий
тип (для ввода
типа поля можно
набрать только
подчеркнутые
буквы или цифры):
Табл.
A: Типы полей
формата Paradox
Alpha
|
строка
длиной 1-255 байт,
содержащая
любые печатаемые
символы
|
Number
|
числовое
поле длиной
8 байт, значение
которого может
быть положительным
и отрицательным.
Диапазон чисел
- от 10-308
до 10308
с 15 значащими
цифрами
|
$
(Money)
|
числовое
поле, значение
которого может
быть положительным
и отрицательным.
По умолчанию,
является
форматированным
для отображения
десятичной
точки и денежного
знака
|
Short
|
числовое
поле длиной
2 байта, которое
может содержать
только целые
числа в диапазоне
от -32768 до 32767
|
Long
Integer
|
числовое
поле длиной
4 байта, которое
может содержать
целые числа
в диапазоне
от -2147483648 до 2147483648
|
#
(BCD)
|
числовое
поле, содержащее
данные в формате
BCD (Binary Coded Decimal). Скорость
вычислений
немного меньше,
чем в других
числовых форматах,
однако точность
- гораздо выше.
Может иметь
0-32 цифр после
десятичной
точки
|
Date
|
поле
даты длиной
4 байта, которое
может содержать
дату от 1 января
9999 г. до нашей
эры - до 31 декабря
9999 г. нашей эры.
Корректно
обрабатывает
високосные
года и имеет
встроенный
механизм проверки
правильности
даты
|
Time
|
поле
времени длиной
4 байта, содержит
время в миллисекундах
от полуночи
и ограничено
24 часами
|
@
(Timestamp)
|
обобщенное
поле даты длиной
8 байт - содержит
и дату и время
|
Memo
|
поле
для хранения
символов,
суммарная
длина которых
более 255 байт.
Может иметь
любую длину.
При этом размер,
указываемый
при создании
таблицы, означает
количество
символов,
сохраняемых
в таблице (1-240)
- остальные
символы сохраняются
в отдельном
файле с расширением
.MB
|
Formatted
Memo
|
поле,
аналогичное
Memo, с добавлением
возможности
задавать шрифт
текста. Также
может иметь
любую длину.
При этом размер,
указываемый
при создании
таблицы, означает
количество
символов,
сохраняемых
в таблице (0-240)
- остальные
символы сохраняются
в отдельном
файле с расширением
.MB. Однако, Delphi в
стандартной
поставке не
обладает
возможностью
работать с
полями типа
Formatted Memo
|
Graphic
|
поле,
содержащее
графическую
информацию.
Может иметь
любую длину.
Смысл размера
- такой же, как
и в Formatted Memo. Database Desktop “умеет”
создавать
поля типа Graphic,
однако наполнять
их можно только
в приложении
|
OLE
|
поле,
содержащее
OLE-данные (Object Linking and
Embedding) - образы, звук,
видео, документы
- которые для
своей обработки
вызывают создавшее
их приложение.
Может иметь
любую длину.
Смысл размера
- такой же, как
и в Formatted Memo. Database Desktop “умеет”
создавать
поля типа OLE,
однако наполнять
их можно только
в приложении.
Delphi “напрямую”
не умеет работать
с OLE-полями, но
это легко
обходится
путем использования
потоков
|
Logical
|
поле
длиной 1 байт,
которое может
содержать
только два
значения - T
(true, истина) или
F
(false, ложь). Допускаются
строчные и
прописные
буквы
|
+
(Autoincrement)
|
поле
длиной 4 байта,
содержащее
нередактируемое
(read-only) значение
типа long
integer.
Значение этого
поля автоматически
увеличивается
(начиная с 1) с
шагом 1 - это
очень удобно
для создания
уникального
идентификатора
записи (физический
номер записи
не может служить
ее идентификатором,
поскольку в
Парадоксе
таковой отсутствует.
В InterBase также отсутствуют
физические
номера записей,
но отсутствует
и поле Autoincrement.
Его с успехом
заменяет
встроенная
функция Gen_id,
которую удобней
всего применять
в триггерах)
|
Binary
|
поле,
содержащее
любую двоичную
информацию.
Может иметь
любую длину.
При этом размер,
указываемый
при создании
таблицы, означает
количество
символов,
сохраняемых
в таблице (0-240)
- остальные
символы сохраняются
в отдельном
файле с расширением
.MB. Это полнейший
аналог поля
BLOb в InterBase
|
Bytes
|
строка
цифр длиной
1-255 байт, содержащая
любые данные
|
Поля таблиц
формата dBase могут
иметь следующий
тип (для ввода
типа поля можно
набрать только
подчеркнутые
буквы или цифры):
Табл.
B: Типы полей
формата dBase
Character
(alpha)
|
строка
длиной 1-254 байт,
содержащая
любые печатаемые
символы
|
Float
(numeric)
|
числовое
поле размером
1-20 байт в формате
с плавающей
точкой, значение
которого может
быть положительным
и отрицательным.
Может содержать
очень большие
величины, однако
следует иметь
в виду постоянные
ошибки округления
при работе с
полем такого
типа. Число
цифр после
десятичной
точки (параметр
Dec в DBD) должно быть
по крайней
мере на 2 меньше,
чем размер
всего поля,
поскольку в
общий размер
включаются
сама десятичная
точка и знак
|
Number
(BCD)
|
числовое
поле размером
1-20 байт, содержащее
данные в формате
BCD (Binary Coded Decimal). Скорость
вычислений
немного меньше,
чем в других
числовых форматах,
однако точность
- гораздо выше.
Число цифр
после десятичной
точки (параметр
Dec в DBD) также должно
быть по крайней
мере на 2 меньше,
чем размер
всего поля,
поскольку в
общий размер
включаются
сама десятичная
точка и знак
|
Date
|
поле
даты длиной
8 байт. По умолчанию,
используется
формат короткой
даты (ShortDateFormat)
|
Logical
|
поле
длиной 1 байт,
которое может
содержать
только значения
“истина” или
“ложь” - T,t,Y,y
(true, истина) или
F,f,N,n
(false, ложь). Допускаются
строчные и
прописные
буквы. Таким
образом, в отличие
от Парадокса,
допускаются
буквы “Y” и “N”
(сокращение
от Yes и No)
|
Memo
|
поле
для хранения
символов,
суммарная
длина которых
более 255 байт.
Может иметь
любую длину.
Это поле хранится
в отдельном
файле. Database Desktop не
имеет возможности
вставлять
данные в поле
типа Memo
|
OLE
|
поле,
содержащее
OLE-данные (Object Linking and
Embedding) - образы, звук,
видео, документы
- которые для
своей обработки
вызывают создавшее
их приложение.
Может иметь
любую длину.
Это поле также
сохраняется
в отдельном
файле. Database Desktop “умеет”
создавать
поля типа OLE,
однако наполнять
их можно только
в приложении.
Delphi “напрямую”
не умеет работать
с OLE-полями, но
это легко
обходится
путем использования
потоков
|
Binary
|
поле,
содержащее
любую двоичную
информацию.
Может иметь
любую длину.
Данное поле
сохраняется
в отдельном
файле с расширением
.DBT. Это полнейший
аналог поля
BLOb в InterBase
|
Поля таблиц
формата InterBase могут
иметь следующий
тип:
Табл.
C: Типы полей
формата InterBase
SHORT
|
числовое
поле длиной
2 байта, которое
может содержать
только целые
числа в диапазоне
от -32768 до 32767
|
LONG
|
числовое
поле длиной
4 байта, которое
может содержать
целые числа
в диапазоне
от -2147483648 до 2147483648
|
FLOAT
|
числовое
поле длиной
4 байта, значение
которого может
быть положительным
и отрицательным.
Диапазон чисел
- от 3.4*10-38
до 3.4*1038
с 7 значащими
цифрами
|
DOUBLE
|
числовое
поле длиной
8 байт (длина
зависит от
платформы),
значение которого
может быть
положительным
и отрицательным.
Диапазон чисел
- от 1.7*10-308
до 1.7*10308
с 15 значащими
цифрами
|
CHAR
|
строка
символов
фиксированной
длины (0-32767 байт),
содержащая
любые печатаемые
символы. Число
символов зависит
от Character Set, установленного
в InterBase для данного
поля или для
всей базы данных
(например, для
символов в
кодировке
Unicode число символов
будет в два
раза меньше
длины строки)
|
VARCHAR
|
строка
символов
переменной
длины (0-32767 байт),
содержащая
любые печатаемые
символы. Число
символов также
зависит от
Character Set, установленного
в InterBase для данного
поля или для
всей базы данных
|
DATE
|
поле
даты длиной
8 байт, значение
которого может
быть от 1 января
100 года до 11 декабря
5941 года (время
также содержится)
|
BLOB
|
поле,
содержащее
любую двоичную
информацию.
Может иметь
любую длину.
Database Desktop не имеет
возможности
редактировать
поля типа BLOB
|
ARRAY
|
поле,
содержащее
массивы данных.
InterBase позволяет
определять
массивы, имеющие
размерность
16. Поле может
иметь любую
длину. Однако,
Database Desktop не имеет
возможности
не только
редактировать
поля типа ARRAY,
но и создавать
их
|
TEXT
BLOB
|
подтип
BLOB-поля, содержащее
только текстовую
информацию.
Может иметь
любую длину.
Database Desktop не имеет
возможности
редактировать
поля типа TEXT
BLOB
|
Типы полей
могут отличаться
от приведенных
выше. Это зависит
от версии драйвера
базы данных.
Итак, мы изучили
все типы полей,
являющиеся
“родными” для
Delphi.
После этого
для таблиц
Paradox мы можем
определить
поля, составляющие
первичный ключ,
причем все они
должны быть
в начале записи,
а первое поле,
входящее в
ключ, должно
быть первым
полем в записи.
Для этого достаточно
по ней дважды
щелкнуть мышкой
или нажать
любую клавишу.
После создания
таблицы, с ней
можно связать
некоторые
свойства, перечень
которых зависит
от формата
таблицы. Так,
для таблиц
формата Paradox можно
задать:
Validity Checks (проверка
правильности)
- относится к
полю записи
и определяет
минимальное
и максимальное
значение, а
также значение
по умолчанию.
Кроме того,
позволяет
задать маску
ввода
Table Lookup (таблица
для “подсматривания”)
- позволяет
вводить значение
в таблицу, используя
уже существующее
значение в
другой таблице
Secondary Indexes (вторичные
индексы) - позволяют
доступаться
к данным в порядке,
отличном от
порядка, задаваемого
первичным
ключом
Referential Integrity (ссылочная
целостность)
- позволяет
задать связи
между таблицами
и поддерживать
эти связи на
уровне ядра.
Обычно задается
после создания
всех таблиц
в базе данных
Password Security (парольная
защита) - позволяет
закрыть таблицу
паролем
Table Language (язык таблицы)
- позволяет
задать для
таблицы языковый
драйвер.
В таблицах
dBase не существует
первичных
ключей. Однако,
это обстоятельство
можно преодолеть
путем определения
уникальных
(Unique) и поддерживаемых
(Maintained) индексов
(Indexes). Кроме того,
для таблиц
dBase можно определить
и язык таблицы
(Table Language) - языковый
драйвер, управляющий
сортировкой
и отображением
символьных
данных.
Определения
дополнительных
свойств таблиц
всех форматов
доступны через
кнопку “Define” (для
таблиц InterBase данная
кнопка называется
“Define Index...” и позволяет
определять
лишь только
индекс, но не
первичный ключ)
в правой верхней
части окна
(группа Table Properties).
Причем, все эти
действия можно
проделывать
не только при
создании таблицы,
но и тогда, когда
она уже существует.
Для этого
используется
команда Table|Restructure
Table (для открытой
в данный момент
таблицы) или
Utilities|Restructure (с возможностью
выбора таблицы).
Однако, если
Вы желаете
изменить структуру
или добавить
новые свойства
для таблицы,
которая в данный
момент уже
используется
другим приложением,
Database Desktop откажет
Вам в этом, поскольку
данная операция
требует монопольного
доступа к таблице.
Но зато все
произведенные
в структуре
изменения сразу
же начинают
“работать”
- например, если
Вы определите
ссылочную
целостность
для пары таблиц,
то при попытке
вставить в
дочернюю таблицу
данные, отсутствующие
в родительской
таблице, в Delphi
возникнет
исключительное
состояние.
В заключение
отметим еще
часто используемую
очень полезную
возможность
Database Desktop. Создавать
таблицу любого
формата можно
не только “с
чистого листа”,
но и путем
копирования
структуры уже
существующей
таблицы. Для
этого достаточно
воспользоваться
кнопкой “Borrow”,
имеющейся в
левом нижнем
углу окна.
Появляющееся
диалоговое
окно позволит
Вам выбрать
существующую
таблицу и
включить/выключить
дополнительные
опции, совпадающие
с уже перечисленными
свойствами
таблиц. Это
наиболее легкий
способ создания
таблиц.
Заключение
Итак, на данном
уроке мы познакомились
со штатной
утилитой,
используемой
для интерактивного
создания и
модификации
таблиц различной
структуры. И
хотя управление
таблицами можно
осуществлять
с помощью различных
средств (компонент
TTable,
компонент
TQuery),
данная утилита
позволяет
делать это в
интерактивном
режиме наиболее
простым способом.
9
Урок 2:
Создание таблиц
с помощью Database
Desktop
Создание
баз данных в
Delphi
Урок 3:
Создание таблиц
с помощью
SQL-запросов
Содержание
урока 3:
Обзор 2
Создание
таблиц с помощью
SQL 2
Заключение 6
Обзор
На данном
уроке мы познакомимся
еще с одной
возможностью
создания таблиц
- через посылку
SQL-запросов. Как
Вы, наверное,
могли заметить
на предыдущем
уроке, Database Desktop не
обладает всеми
возможностями
по управлению
SQL-серверными
базами данных.
Поэтому с помощью
Database Desktop удобно создавать
или локальные
базы данных
или только
простейшие
SQL-серверные
базы данных,
состоящие из
небольшого
числа таблиц,
не очень сильно
связанных друг
с другом. Если
же Вам необходимо
создать базу
данных, состоящую
из большого
числа таблиц,
имеющих сложные
взаимосвязи,
можно воспользоваться
языком SQL. При
этом можно
воспользоваться
компонентом
Query
в Delphi, каждый раз
посылая по
одному SQL-запросу,
а можно записать
всю последовательность
SQL-предложений
в один так называемый
скрипт
и послать его
на выполнение.
Конечно, для
этого нужно
хорошо знать
язык SQL, но, уверяю
Вас, сложного
в этом ничего
нет! Конкретные
реализации
языка SQL незначительно
отличаются
в различных
SQL-серверах, однако
базовые предложения
остаются одинаковыми
для всех реализаций.
Создание
таблиц с помощью
SQL
Если Вы хотите
воспользоваться
компонентом
TQuery,
сначала поместите
его на форму.
После этого
настройте
свойство DatabaseName
на нужный Вам
алиас. После
этого можно
ввести SQL-предложение
в свойство SQL.
Для выполнения
запроса, изменяющего
структуру,
вставляющего
или обновляющего
данные на сервере,
нужно вызвать
метод ExecSQL
компонента
TQuery.
Для выполнения
запроса, получающего
данные с сервера
(т.е. запроса,
в котором основным
является оператор
SELECT), нужно вызвать
метод Open
компонента
TQuery.
Это связано
с тем, что BDE при
посылке запроса
типа SELECT открывает
так называемый
курсор,
с помощью которого
осуществляется
навигация по
выборке данных
(подробней об
этом см. в уроке,
посвященном
TQuery).
Приведем
упрощенный
синтаксис
SQL-предложения
для создания
таблицы на
SQL-сервере InterBase
(более полный
синтаксис можно
посмотреть
в online-справочнике
по SQL, поставляемом
с локальным
InterBase):
CREATE TABLE table
( [,
| ...]);
где
table
- имя создаваемой
таблицы,
- описание поля,
- описание
ограничений
и/или ключей
(квадратные
скобки []
означают
необязательность,
вертикальная
черта |
означает “или”).
Описание
поля состоит
из наименования
поля и типа
поля (или домена
- см. урок 9), а также
дополнительных
ограничений,
накладываемых
на поле:
=
col {datatype | COMPUTED BY () | domain}
[DEFAULT
{literal | NULL | USER}]
[NOT NULL]
[]
[COLLATE
collation]
Здесь
col
- имя поля;
datatype
- любой правильный
тип SQL-сервера
(для InterBase такими
типами являются
SMALLINT,
INTEGER,
FLOAT,
DOUBLE
PRECISION, DECIMAL,
NUMERIC,
DATE,
CHAR,
VARCHAR,
NCHAR,
BLOB),
символьные
типы могут
иметь CHARACTER SET - набор
символов,
определяющий
язык страны.
Для русского
языка следует
задать набор
символов WIN1251;
COMPUTED
BY () - определение
вычисляемого
на уровне сервера
поля, где
- правильное
SQL-выражение,
возвращающее
единственное
значение;
domain
- имя домена
(обобщенного
типа), определенного
в базе данных;
DEFAULT
- конструкция,
определяющая
значение поля
по умолчанию;
NOT
NULL - конструкция,
указывающая
на то, что поле
не может быть
пустым;
COLLATE
- предложение,
определяющее
порядок сортировки
для выбранного
набора символов
(для поля типа
BLOB не применяется).
Русский набор
символов WIN1251
имеет 2 порядка
сортировки
- WIN1251 и PXW_CYRL. Для правильной
сортировки,
включающей
большие буквы,
следует выбрать
порядок PXW_CYRL.
Описание
ограничений
и/или ключей
включает в себя
предложения
CONSTRAINT
или предложения,
описывающие
уникальные
поля, первичные,
внешние ключи,
а также ограничения
CHECK
(такие конструкции
могут определяться
как на уровне
поля, так и на
уровне таблицы
в целом, если
они затрагивают
несколько
полей):
= [CONSTRAINT constraint ]
Здесь
= {{PRIMARY KEY | UNIQUE} (col[,col...]) | FOREIGN KEY (col [, col
...]) REFERENCES other_table
| CHECK
()}
=
{
{ | ()}
| [NOT]
BETWEEN AND
| [NOT]
LIKE [ESCAPE ]
| [NOT]
IN ( [, ...] |
= {
col []
| | |
| NULL | USER |
RDB$DB_KEY } [COLLATE collation]
=
num | "string" | charsetname "string"
= {
COUNT (* | [ALL]
| DISTINCT )
| SUM ([ALL]
| DISTINCT )
|
AVG ([ALL] | DISTINCT )
| MAX ([ALL]
| DISTINCT )
| MIN ([ALL]
| DISTINCT )
| CAST (
AS )
| UPPER ()
| GEN_ID
(generator, )
}
=
{= | < | > | <= | >= | !< | !> | <> | !=}
=
выражение
SELECT по одному
полю, которое
возвращает
в точности одно
значение.
Приведенного
неполного
синтаксиса
достаточно
для большинства
задач, решаемых
в различных
предметных
областях. Проще
всего синтаксис
SQL можно понять
из примеров.
Поэтому мы
приведем несколько
примеров создания
таблиц с помощью
SQL.
Пример
A: Простая таблица
с конструкцией
PRIMARY KEY
на уровне поля
CREATE TABLE REGION
(
REGION
REGION_NAME NOT NULL PRIMARY KEY,
POPULATION INTEGER
NOT NULL);
Предполагается,
что в базе данных
определен домен
REGION_NAME,
например, следующим
образом:
CREATE DOMAIN
REGION_NAME
AS VARCHAR(40)
CHARACTER SET WIN1251 COLLATE PXW_CYRL;
Пример
B: Таблица с
предложением
UNIQUE
как на уровне
поля, так и на
уровне таблицы
CREATE TABLE GOODS (
MODEL SMALLINT NOT
NULL UNIQUE,
NAME CHAR(10) NOT
NULL,
ITEMID INTEGER NOT
NULL, CONSTRAINT MOD_UNIQUE
UNIQUE (NAME,
ITEMID));
Пример
C: Таблица с
определением
первичного
ключа, внешнего
ключа и конструкции
CHECK,
а также символьных
массивов
CREATE TABLE JOB (
JOB_CODE JOBCODE
NOT NULL,
JOB_GRADE JOBGRADE
NOT NULL,
JOB_REGION
REGION_NAME NOT NULL,
JOB_TITLE
VARCHAR(25) CHARACTER SET WIN1251 COLLATE PXW_CYRL NOT NULL,
MIN_SALARY SALARY
NOT NULL,
MAX_SALARY SALARY
NOT NULL,
JOB_REQ BLOB(400,1)
CHARACTER SET WIN1251,
LANGUAGE_REQ
VARCHAR(15) [5],
PRIMARY KEY
(JOB_CODE, JOB_GRADE, JOB_REGION),
FOREIGN KEY
(JOB_REGION) REFERENCES REGION (REGION),
CHECK (MIN_SALARY <
MAX_SALARY));
Данный пример
создает таблицу,
содержащую
информацию
о работах
(профессиях).
Типы полей
основаны на
доменах JOBCODE,
JOBGRADE,
REGION_NAME
и SALARY.
Определен
массив LANGUAGE_REQ,
состоящий из
5 элементов
типа VARCHAR(15).
Кроме того,
введено поле
JOB_REQ,
имеющее тип
BLOB
с подтипом 1
(текстовый
блоб) и размером
сегмента 400.
Для таблицы
определен
первичный ключ,
состоящий из
трех полей
JOB_CODE,
JOB_GRADE
и JOB_REGION.
Далее, определен
внешний ключ
(JOB_REGION),
ссылающийся
на поле REGION
таблицы REGION.
И, наконец, включено
предложение
CHECK,
позволяющее
производить
проверку соотношения
для двух полей
и вызывать
исключительное
состояние при
нарушении
такого соотношения.
Пример
D: Таблица с
вычисляемым
полем
CREATE
TABLE SALARY_HISTORY (
EMP_NO EMPNO NOT
NULL,
CHANGE_DATE DATE
DEFAULT "NOW" NOT NULL,
UPDATER_ID
VARCHAR(20) NOT NULL,
OLD_SALARY SALARY
NOT NULL,
PERC_CHANGE DOUBLE
PRECISION DEFAULT 0 NOT NULL
CHECK (PERC_CHANGE
BETWEEN -50 AND 50),
NEW_SALARY COMPUTED
BY
(OLD_SALARY +
OLD_SALARY * PERC_CHANGE / 100),
PRIMARY KEY (EMP_NO,
CHANGE_DATE, UPDATER_ID),
FOREIGN KEY (EMP_NO)
REFERENCES EMPLOYEE (EMP_NO));
Данный пример
создает таблицу,
где среди других
полей имеется
вычисляемое
(физически не
существующее)
поле NEW_SALARY,
значение которого
вычисляется
по значениям
двух других
полей (OLD_SALARY
и PERC_CHANGE).
Заключение
Итак, мы
рассмотрели,
как создавать
таблицы с помощью
SQL-выражений.
Этот процесс,
хотя и не столь
удобен, как
интерактивное
средство Database
Desktop, однако обладает
наиболее гибкими
возможностями
по настройке
Вашей системы
и управления
ее связями.
6
Урок 3: Создание
таблиц с помощью
SQL запросов
Создание баз
данных в Delphi
Урок
4: ОбъектTTable
Содержание
урока 4:
Содержание
урока 4: 1
Класс
TDataSet 2
Открытие
и закрытие
DataSet 4
Поля 10
Работа
с Данными 14
Использование
SetKey для поиска
в таблице 17
Использование
фильтров для
ограничения
числа записей
в DataSet 20
Обновление
(Refresh) 22
Закладки
(Bookmarks) 23
Создание
Связанных
Курсоров (Linked
cursors) 23
Основные
понятия о
TDataSource 26
Использование
TDataSource для проверки
состояния
БД: 27
Отслеживание
состояния
DataSet 31
Обзор
Статья содержит
всесторонний
обзор основных
фактов которые
Вы должны знать,
прежде чем
начать писать
программы,
работающие
с Базами Данных
(БД). Прочитав
эту статью, Вы
должны понять
большинство
механизмов
доступа к данным,
которые есть
в Delphi.
Более
подробно здесь
рассказывается
о TTable и TDataSource.
Имеются несколько
основных
компонент(объектов),
которые Вы
будете использовать
постоянно для
доступа к БД.
Эти объекты
могут быть
разделены на
три группы:
невизуальные:
TTable, TQuery, TDataSet, TField
визуальные:
TDBGrid, TDBEdit
связующие:
TDataSource
Первая группа
включает невизуальные
классы, которые
используются
для управления
таблицами и
запросами. Эта
группа сосредотачивается
вокруг компонент
типа TTable, TQuery, TDataSet и TField.
В Палитре Компонент
эти объекты
расположены
на странице
Data Access.
Вторая важная
группа классов
- визуальные,
|