Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 13
Занятие 7.
На начальном этапе работ по созданию базы данных, прежде всего, необходимо подготовить на бумаге схему организации БД. В эту схему должны войти:
Все эти действия удобнее провести на предварительном этапе, поскольку они требуют единого взгляда на всю БД, что трудно реализовать в процессе работы за компьютером.
2. Создание и просмотр псевдонима БД.
Обычно вызов Database Desktop включен в главное меню Delphi в раздел Tools либо в русской версии Delphi6 в пункт главного меню «Сервис». Если это не сделано, можно включить его туда командой Tools|Configure Tools… (файл DBD32.exe).
Перед вызовом DBD необходимо создать (если он еще не создан) каталог, в котором будут храниться файлы с таблицами БД, например, BD_Radio.
После вызова DBD необходимо создать первую главную таблицу БД, например,
таблицу Dep с полями State и Proisv
Должность |
Тип |
State |
Proisv |
Студенты |
учащиеся |
Преподаватели |
сотрудники |
Деканат |
сотрудники |
Для этого сначала в меню Tools выбираем пункт Alias Manager, в появившемся меню нажимаем на кнопку New, затем в пункте Database Alias вводим имя нашей БД и указываем путь к ней Path:, далее нажимаем кнопку Keep New, затем нажимаем OK. (Рис.1.)
Затем эту таблицу необходимо сохранить в каталог БД которую назвали DB_Stuff_RF. Нашу БД мы могли бы назвать и короче, однако в этом случае, по названию трудно было бы определить ее функции.
При выборе псевдонима в списке Database Alias автоматически изменяется тип драйвера в выпадающем списке.
Таким образом, еще раз повторим, что для добавления нашей БД необходимо открыть Alias Manager и ввести в соответствующие поля название БД (Database alias) , ее тип (он определяется типом драйвера Driver type) и путь (Path) т.е. полный «адрес» каталога, в котором будут храниться файлы с таблицами нашей БД. Например, Path: E:\Copy_Programs\Delphi_Practik\DB_Radio_F.(Рис.2)
Рис. 1
Рис. 2
Для создания таблиц можно также проделать следующие операции: после старта Database Desktop выберите команду меню File|New|Table для создания новой таблицы. Перед Вами появится диалоговое окно выбора типа таблицы, как показано на рис 3. Вы можете выбрать любой формат из предложенного, включая различные версии одного и того же формата.
После выбора типа таблицы Database Desktop представит Вам диалоговое окно, специфичное для
Рис.3
каждого формата, в котором Вы сможете определить поля таблицы и их тип, как показано на рис.4 .
Рис. 4
После набора имени поля в графе Field Name Вы должны перейти к графе Type (тип) для задания типа поля. Для этого можно нажать клавишу Тab на клавиатуре либо воспользоваться «мышью». Затем навести курсор на черный квадрат, появившийся в графе Type и нажать на пробел. При работе на первых порах удобно пользоваться подсказкой, текст которой появляется непосредственно под серой областью окна.
Имя поля в таблице формата Paradox представляет собой строку, написание которой подчиняется следующим правилам:
· Имя должно быть не длиннее 25 символов.
· Имя не должно начинаться с пробела, однако может содержать пробелы. Однако, если Вы предполагаете в будущем переносить базу данных в другие форматы, разумнее будет избегать включения пробелов в название поля. Фактически, в целях переносимости лучше ограничиться девятью символами в названии поля, не включая в него пробелы.
· Имя не должно содержать квадратные, круглые или фигурные скобки [], () или {}, тире, а также комбинацию символов “тире” и “больше” (->).
· Имя не должно быть только символом #, хотя этот символ может присутствовать в имени среди других символов. Хотя Paradox поддерживает точку (.) в названии поля, лучше ее избегать, поскольку точка зарезервирована в Delphi для других целей.
Имя поля в таблице формата dBase представляет собой строку, написание которой подчиняется правилам, отличным от Paradox:
Имя должно быть не длиннее 10 символов.
Пробелы в имени недопустимы.
Таким образом, Вы видите, что имена полей в формате 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) - языковый драйвер, управляющий сортировкой и отображением символьных данных.
Рис.5 Определение уникального ключа в таблице dBase.
Определения дополнительных свойств таблиц всех форматов доступны через кнопку “Define” (для таблиц InterBase данная кнопка называется “Define Index...” и позволяет определять лишь только индекс, но не первичный ключ) в правой верхней части окна (группа Table Properties). Причем, все эти действия можно проделывать не только при создании таблицы, но и тогда, когда она уже существует. Для этого используется команда Table|Restructure Table (для открытой в данный момент таблицы) или Utilities|Restructure (с возможностью выбора таблицы). Однако если Вы желаете изменить структуру или добавить новые свойства для таблицы, которая в данный момент уже используется другим приложением, Database Desktop откажет Вам в этом, поскольку данная операция требует монопольного доступа к таблице. Но зато все произведенные в структуре изменения сразу же начинают “работать” - например, если Вы определите ссылочную целостность для пары таблиц, то при попытке вставить в дочернюю таблицу данные, отсутствующие в родительской таблице, в Delphi возникнет исключительное состояние.
В заключение отметим еще часто используемую очень полезную возможность Database Desktop. Создавать таблицу любого формата можно не только “с чистого листа”, но и путем копирования структуры уже существующей таблицы. Для этого достаточно воспользоваться кнопкой “Borrow”, имеющейся в левом нижнем углу окна. Появляющееся диалоговое окно позволит Вам выбрать существующую таблицу и включить/выключить дополнительные опции, совпадающие с уже перечисленными свойствами таблиц. Это наиболее легкий способ создания таблиц.
. Заключение
Итак, мы познакомились со штатной утилитой, используемой для интерактивного создания и модификации таблиц различной структуры. И хотя управление таблицами можно осуществлять с помощью различных средств (SQL-скрипт в WISQL, компонент TTable, компонент TQuery), данная утилита позволяет делать это в интерактивном режиме наиболее простым способом.
2. Создание таблиц с помощью компонента TTable
Для создания таблиц компонент TTable имеет метод CreateTable. Этот метод создает новую пустую таблицу заданной структуры. Данный метод (процедура) может создавать только локальные таблицы формата dBase или Paradox.
Компонент TTable можно поместить на форму в режиме проектирования или создать динамически во время выполнения. В последнем случае перед использованием его необходимо создать, например, с помощью следующей конструкции:
var
Table1: TTable;
...
Table1:=TTable.Create(nil);
...
Перед вызовом метода CreateTable необходимо установить значения свойств
TableType - тип таблицы
DatabaseName - база данных
TableName - имя таблицы
FieldDefs - массив описаний полей
IndexDefs - массив описаний индексов.
Свойство TableType имеет тип TTableType и определяет тип таблицы в базе данных. Если это свойство установлено в ttDefault, тип таблицы определяется по расширению файла, содержащего эту таблицу:
Расширение .DB или без расширения: таблица Paradox
Расширение .DBF : таблица dBASE
Расширение .TXT : таблица ASCII (текстовый файл).
Если значение свойства TableType не равно ttDefault, создаваемая таблица всегда будет иметь установленный тип, вне зависимости от расширения:
ttASCII: текстовый файл
ttDBase: таблица dBASE
ttParadox: таблица Paradox.
Свойство DatabaseName определяет базу данных, в которой находится таблица. Это свойство может содержать:
BDE Alias
директорий для локальных БД
директорий и имя файла базы данных для Local InterBase
локальный алиас, определенный через компонент TDatabase.
Свойство TableName определяет имя таблицы базы данных.
Свойство FieldDefs (имеющее тип TFieldDefs) для существующей таблицы содержит информацию обо всех полях таблицы. Эта информация доступна только в режиме выполнения и хранится в виде массива экземпляров класса TFieldDef, хранящих данные о физических полях таблицы (т.о. вычисляемые на уровне клиента поля не имеют своего объекта TFieldDef). Число полей определяется свойством Count, а доступ к элементам массива осуществляется через свойство Items:
property Items[Index: Integer]: TFieldDef;
При создании таблицы, перед вызовом метода CreateTable, нужно сформировать эти элементы. Для этого у класса TFieldDefs имеется метод Add:
procedure Add(const Name: string; DataType: TFieldType; Size: Word; Required: Boolean);
Параметр Name, имеющий тип string, определяет имя поля. Параметр DataType (тип TFieldType) обозначает тип поля. Он может иметь одно из следующих значений, смысл которых ясен из их наименования:
TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftBlob, ftMemo,
ftGraphic);
Параметр Size (тип word) представляет собой размер поля. Этот параметр имеет смысл только для полей типа ftString, ftBytes, ftVarBytes, ftBlob, ftMemo, ftGraphic, размер которых может сильно варьироваться. Поля остальных типов всегда имеют строго фиксированный размер, так что данный параметр для них не принимается во внимание. Четвертый параметр - Required - определяет, может ли поле иметь пустое значение при записи в базу данных. Если значение этого параметра - true, то поле является “требуемым”, т.е. не может иметь пустого значения. В противном случае поле не является “требуемым” и, следовательно, допускает запись значения NULL.
Если Вы желаете индексировать таблицу по одному или нескольким полям, используйте метод Add для свойства IndexDefs, которое, как можно догадаться, также является объектом, т.е. экземпляром класса TIndexDefs. Свойство IndexDefs для существующей таблицы содержит информацию обо всех индексах таблицы. Эта информация доступна только в режиме выполнения и хранится в виде массива экземпляров класса TIndexDef, хранящих данные об индексах таблицы. Число индексов определяется свойством Count, а доступ к элементам массива осуществляется через свойство Items:
property Items[Index: Integer]: TIndexDef;
Метод Add класса TIndexDefs имеет следующий вид:
procedure Add(const Name, Fields: string;
Options: TIndexOptions);
Параметр Name, имеющий тип string, определяет имя индекса. Параметр Fields (также имеющий тип string) обозначает имя поля, которое должно быть индексировано, т.е. имя индексируемого поля. Составной индекс, использующий несколько полей, может быть задан списком имен полей, разделенных точкой с запятой “;”, например: Field1;Field2;Field4. Последний параметр - Options - определяет тип индекса. Он может иметь набор значений, описываемых типом TIndexOptions:
TIndexOptions = set of (ixPrimary, ixUnique, ixDescending,
ixCaseInsensitive, ixExpression);
Поясним эти значения. ixPrimary обозначает первичный ключ, ixUnique - уникальный индекс, ixDescending - индекс, отсортированный по уменьшению значений (для строк - в порядке, обратном алфавитному), ixCaseInsensitive - индекс, “нечувствительный” к регистру букв, ixExpression - индекс по выражению. Опция ixExpression позволяет для таблиц формата dBase создавать индекс по выражению. Для этого достаточно в параметре Fields указать желаемое выражение, например: 'Field1*Field2+Field3'. Вообще говоря, не все опции индексов применимы ко всем форматам таблиц. Ниже мы приведем список допустимых значений для таблиц dBase и Paradox:
Опции индексов dBASE Paradox
---------------------------------------
ixPrimary
ixUnique
ixDescending
ixCaseInsensitive
ixExpression
Необходимо придерживаться указанного порядка применения опций индексов во избежание некорректной работы. Следует отметить, что для формата Paradox опция ixUnique может использоваться только вместе с опцией ixPrimary .
Итак, после заполнения всех указанных выше свойств и вызова методов Add для FieldDefs и IndexDefs необходимо вызвать метод класса TTable - CreateTable:
with Table1 do
begin
DatabaseName:='dbdemos';
TableName:='mytest';
TableType:=ttParadox;
{Создать поля}
with FieldDefs do
begin
Add('Surname', ftString, 30, true);
Add('Name', ftString, 25, true);
Add('Patronymic', ftString, 25, true);
Add('Age', ftInteger, 0, false);
Add('Weight', ftFloat, 0, false);
end;
{Сгенерировать индексы}
with IndexDefs do
begin
Add('I_Name', 'Surname;Name;Patronymic', [ixPrimary, ixUnique]);
Add('I_Age', 'Age', [ixCaseInsensitive]);
end;
CreateTable;
end;
Индексы можно сгенерировать и не только при создании таблицы. Для того чтобы сгенерировать индексы для существующей таблицы, нужно вызвать метод AddIndex класса TTable, набор параметров которого полностью повторяет набор параметров для метода Add класса TIndexDefs:
procedure AddIndex(const Name, Fields: string;
Options: TIndexOptions);
При этом для метода AddIndex справедливы все замечания по поводу записи полей и опций индексов, сделанные выше.
3. Заключение
Итак, мы познакомились с еще одним способом создания таблиц - способом, использующим метод CreateTable класса TTable. Использование данного способа придаст Вашему приложению максимальную гибкость, и Вы сможете строить локальные таблицы “на лету”. Сопутствующим методом является метод AddIndex класса TTable, позволяющий создавать индексы для уже существующей таблицы. Подчеркнем еще раз, что данный способ применим только для локальных таблиц. Более общий способ состоит в использовании SQL-запросов.
Особо отметим, что Delphi является мощным инструментом для работы с базами данных, и, как следствие, его некорректное использование может служить источником серьезных проблем и нарушений работы системы вплоть до ее выхода их строя. Поэтому в случае возникновения непредвиденных либо непонятных ситуаций разумнее отменить все действия и вернуться к началу. В случае, когда Вы записывали все шаги, Вам легче будет разобраться с ситуацией и преодолеть возникшие трудности.
Теперь можно перейти к созданию приложения для работы с нашей базой данных, предварительно отметив, что для создания приложений существуют также компоненты BDE Administrator и Database Explorer (SQL Explorer).
Вызов этой программы производится из главного меню Delphi командой Database| Explore.