С точки зрения Object Pascal таблица формата dbf представляет собой нетипизированный файл произвольного доступа. В его структуре есть три основные части: заголовок файла, описание полей таблицы и данные. Состав данных, представленных в заголовке файла, позволяет вычислить смещение, по которому можно прочитать любое поле записи, имеющейся в таблице.

Заголовок таблицы dbf.

На Object Pascal описание заголовка файла могло бы выглядеть так:

TDbfHeader = record

  DbfId : byte;

  LastUpdate : array[0..2] of byte;

  RecordsCount : LongWord;

  DataOffset : Word;

  RecordSize : Word;

  Filler : array[1..20] of char;

end;

 

Поясним значения полей этой записи.

Первым идет поле DbfId, которое описывает тип файла. Оно занимает 1 байт по смещению 00h. Класс TDbfTable разрабатывался для работы с таблицами, созданными в программах, написанных на ранних версиях dBase, Clipper и FoxPro, не имеющих полей Memo. Для таких таблиц такого типа это поле имеет значение 03h.

Второе поле заголовка – LastUpdate – дата последнего обновления таблицы. Оно занимает 3 байта начиная со смещения 01h. Здесь дата кодируется следующим образом: первый байт указывает год (последние 2 цифры), второй – месяц, третий – день. В классе TDbfTable оно представлено свойством LastUpdated, которое имеет тип TDate.

Следующее поле показывает число записей и представлено четырехбайтовым беззнаковым целым числом (тип LongWord в Delphi 7). Таким образом, количество записей в таблице dbf ограничено числом 4294967296, хотя, конечно, таких огромных таблиц в реальных условиях не встречается. Это поле в классе TDbfTable оно представлено свойством RecordsCount.

Затем следует поле DataOffset, указывающее на смещение, по которому находится первая запись в файле. Также это поле указывает на общий размер заголовка файла и описаний полей. Тип этого поля – двухбайтовое беззнаковое целое число. В классе TDbfTable оно представлено свойством типа Word (HeaderSize). Хотя это название и не совсем верно, но оно устоялось в среде разработчиков баз данных в xBase СУБД, внося, впрочем, известную терминологическую путаницу).

Поле RecordSize, следуещее за полем DataOffset, указывает размер записи в байтах. Это число равно сумме длин всех полей плюс 1 байт, использующийся для пометки записи на удаление. Размер записи, следовательно, не может быть больше 65536 байт (двухбайтовое беззнаковое целое). В классе TDbfTable оно представлено свойством типа Word.

Остальное пространство заголовка файла заполняется нулями и считается зарезервированным. Оно по разному используется в различных версиях xBase систем. Некоторые из них хранят там сведения о блокировке записей, наличии индексного файла и его типе, кодовой странице, региональных параметрах отображения сумм, дат и другие данные.

Поскольку класс TDbfTable ориентирован на работу с таблицами в первую очередь dBase и Clipper, то при описании заголовка файла, а также описаний полей использовался формат файлов dbf, использующийся в Clipper версии 5 [3].

Описания полей.

С 33-го байта файла начинаются описания полей таблицы. Теоретически полей в dbf-таблице может  2047. Это число которое получается, если вычесть размер заголовка из максимально возможного смещения первой записи, учитывая, что на описание каждого поля отводится 32 байта.  Однако dBase III и FoxBase не поддерживает файлы более с чем 128 полями [4]. Кроме того, таблицы с таким большим числом полей из-за неудобства использования и отрицательного влияния на быстродействие базы данных практически не создаются.

Поскольку заголовок файла никак не указывает на число полей, то описания полей ограничиваются символом 0Dh.

На языке Object Pascal структура, описывающее поле dbf-таблицы выглядит так:

TDbfField = record

  dfFieldName : string[11];

  dfFieldType : char;

  dfFieldLength : byte;

  dfFieldDecimals : byte;

end;

 

Поясним назначение каждого поля этой записи.

Параметр dfFieldName – строка, содержащая 11 символов, содержащая имя описываемого поля. Имена полей могут содержать латинские буквы, цифры и символ подчеркивания. Начинаться название поля должно с буквы латинского алфавита. Если название поля меньше 11 символов, то оно дополняется этой длины символами 00h.

Следующий параметр - dfFieldType - описывает тип поля. Тип поля определяется одним символом – буквой (тип char) и может принимать значения, указанные в таблице.

Далее следует dfFieldLength – описатель длины поля. Этот параметр занимает 1 байт. Таким образом, длина одного поля dbf-файла не может быть более 255 байт.

Параметр dfFieldDecimals показывает сколько в поле десятичных знаков. Указывается только для числовых полей.

Обозначение

типа

Название типа

Максимальная

длина

Описание типа

С

Символьный

254

Строка символов

N

Числовой

19

Числовое поле с фиксированной точкой. В число знаков входит десятичная точка, если предполагается вводить дробные значения. Максимальное число десятичных знаков – 9.

F

С плавающей точкой

19

Описание соответствует полю типа N. Позиция десятичной точки может меняться.

L

Логическое

1

Хранит логические значения. Значение "истина" записывается как "T", "t", "Y" или "y", "ложь" – "F", "f", "N" или "n".

M

Поле Memo

Зависит от СУБД

Текстовое поле длиной более 254 знаков. Поскольку в разных СУБД хранение полей этого типа различно, а используются они достаточно редко, было решено их поддержку в класс TDbfTable не включать.

D

Дата

8

Дата в формате YYYYMMDD. Некоторые версии xBase СУБД хранят дату в соответствии с региональными настройками системы.

 

Записи таблицы.

После описаний полей следует символ 0Dh, который показывает, что дальше начинаются записи таблицы.Записи в файле формата dbf следуют одна за другой, поля записываются без разделителей, маркеры конца записи также не используются. Перед записью находится байт, предназначенный для записи символа пометки на удаление. Если он имеет значение 00h или 20h, то запись не помечена. Помеченные же записи содержат в этом байте значение 2Ah.

 

Назад
Сайт создан в системе uCoz