Типы данных
В среде разработки Delphi можно создавать приложения для работы с самыми разными базами данных. Такая универсальность подразумевает необходимость применения средств, которые бы обеспечили возможность работы со многими типами данных, используемыми в этих базах данных.
Естественно, что существует большая группа типов данных, конкретная реализация которых практически не отличается от платформы к платформе. Это, например, строки, символы, целые и вещественные числа и т. д.
Есть типы данных, которые реализованы далеко не на каждой платформе. Есть, наконец, просто уникальные типы данных.
Для удовлетворения потребностей разработчиков в Delphi применен следующий способ работы с типами данных.
Тип данных однозначно связан с конкретным полем таблицы базы данных. Без этого поля само понятие типа данных не имеет практического смысла. В Delphi свойства абстрактного поля инкапсулирует класс TField, который не имеет заранее определенного типа данных. Уже от этого класса порождено целое семейство классов для типизированных полей (см. рис. 13.1), каждый из которых умеет обращаться со своим типом данных.
Примечание
В классе TField имеется свойство DataType, которое отвечает за тип данных, но оно не может быть изменено.
Весь список доступных типов данных содержится в типе TFiieidType:
type TFieldType = (ftUnknown, ftString, ftSmallint, ftlnteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftlnterface, ftlDispatch, ftGuid, ftTimeStamp, ftFMTBcd);
В табл. 13.1 рассматриваются все типы данных, которые можно использовать при разработке приложений для работы с базами данных.
Таблица 13.1. Типы данных
Тип |
Класс |
Описание |
Неизвестный (ftUnknown) |
Неопределенный тип данных |
|
Строковый (ftString) |
TStringField |
Строка длиной до 8192 символов |
Целый короткий (ftSmallint) |
TSmalllntField |
16-битное целое в диапазоне от -32 768 до 32 767 |
Целый (ftlnteger) |
TIntegerField |
32-битное целое в диапазоне от -2 147 483 648 до 2 147 483 647 |
Целый положительный (ftWord) |
TWordField |
1 6-битное целое в диапазоне от 0 до 65535 |
Логический (ftBoolean) |
TBooleanField |
Значения True и False |
Вещественный (ftFloat) |
TFloatField |
Вещественные положительные и отрицательные числа с точностью 15 цифр после запятой в диапазоне от 5,0x1 0"324 до 1,7x1 0308 |
Денежный (ftCurrency) |
TCurrencyField |
Вещественные положительные и отрицательные числа с точностью 15 цифр после запятой в диапазоне от 5,0x1 0"324 до 1,7x1 0308. Дополнительно вставляется символ валюты |
Десятичный с двоичным кодированием (ftBCD) |
TBCDField |
Вещественные числа с повышенной точностью (до 4 знаков перед запятой и до 20 знаков после запятой). Могут храниться в двоичном и десятичном форматах |
Дата (ftDate) |
TDateField |
Дата |
Время (ftTime) |
TDateTimeField |
Время |
Календарный (ftDateTime) |
TDateTimeField |
Комбинированный формат с одновременным хранением даты и времени |
Фиксированный буфер (ftBytes) |
TBytesField |
Набор байтов фиксированного размера. Для работы с этим типом требуется выделять и освобождать память (методы GetMem И FreeMem) |
Переменный буфер (ftVarBytes) |
TVarBytes Field |
Набор байтов переменного размера. Текущий размер буфера хранится в первых двух байтах. Для работы с этим типом требуется выделять и освобождать память (методы GetMem И FreeMem) |
Автоинкрементный (ftAutoInc) |
TAutoIncField |
Значение поля в каждой новой записи автоматически увеличивается на 1 . Целое число в диапазоне от -2 147 483 648 до 2 147 483 647. Применяется для обеспечения уникальности значений ключей |
BLOB (ftBlob) |
TBLOBField |
Большой двоичный массив. Используется для хранения любых данных, которые можно преобразовать в цифровой массив (Memo, Graphic). В базах данных такие данные хранятся в отдельных файлах, а поле содержит лишь ссылки на них |
Memo (ftMemo) |
TMemoField |
Набор строк произвольной длины |
Графический (ftGraphic) |
TGraphicField |
Формат для хранения изображений |
Форматированный Memo (ftFmtMemo) |
Форматированный набор строк произвольной длины |
OLE Paradox (ftParadoxOle) |
Поле OLE для таблиц Paradox |
OLE dBASE (ftDBaseOle) |
Поле OLE для таблиц dBASE |
|
Типизированный двоичный (ftTypedBinary) |
Типизированный двоичный |
|
Курсор Oracle (ftCursor) |
Курсор для хранимых процедур сервера Oracle |
|
Фиксированный символьный (ftFixedChar) |
TStringField |
Строка символов с нулевым символом в конце |
Расширенный строковый (ftWideString) |
Динамически выделяемая строка 16-битных символов в кодировке Unicode |
|
Целый большой (ftLargeint) |
TLargelntField |
64-битное целое число |
Абстрактный (ftADT) |
TADTField |
Произвольный тип данных, создаваемый пользователем на сервере БД и используемый в приложении |
Массив (ftArray) |
TArrayField |
Массив полей любого типа, кроме TarrayField |
Ссылочный (ftReference) |
TReferenceField |
Указатель на объект, содержащийся в другой таблице |
Набор данных (ftDataSet) |
TDataSetField |
Содержит набор данных, интегрированный в текущий набор данных |
BLOB Oracle 8 (ftOraBlob) |
Тип BLOB для сервера Oracle 8 |
|
CLOB Oracle 8 (ftOraClob) |
Тип CLOB для сервера Oracle 8 |
|
Вариант (ftVariant) |
TVariantField |
Вариант |
Интерфейс (ftlnterface) |
TInterfaceField |
Ссылка на интерфейс (потомок от lUnknown) |
Ссылка на интерфейс IDispatch (ftlDispatch) |
TIDispatchField |
Ссылка на интерфейс (потомок от IDispatch) |
Глобальный идентификатор (ftGuid) |
TGuidField |
Глобальный идентификатор GUID |
Календарный (ftTimeStamp) |
Календарный тип для наборов данных dbExpress |
|
Десятичный с двоичным кодированием (ftFMTBcd) |
TFMTBCDField |
Тип BCD повышенной точности |
Примечание
В Delphi тип данных BCD напрямую не поддерживается. Его использование обеспечивает денежный тип (ftcurrency). Поэтому точность BCD ограничена 20 цифрами после запятой. Для устранения этого ограничения используется тип FMTBcd, который обладает требуемой точностью.
Как видно из таблицы, наряду с традиционными типами данных, в Delphi имеются и специальные типы, использование которых значительно расширяет функциональность приложений. В частности, типы ftinterface, ftIDispatch, ftGuid позволяют создавать полноценные приложения БД для СОМ и OLE DB.
Практически на всех серверах БД пользователь имеет возможность создавать собственные типы данных. Для их использования в приложениях Delphi имеется абстрактный тип данных и класс TADTField. Абстрактный тип может включать любой скалярный тип данных (числа, даты, ссылки, массивы, наборы данных).
Автоинкрементный тип данных давно используется в СУБД. Поле автоинкрементного типа для каждой новой записи автоматически увеличивает свое значение на единицу. Тем самым, каждая запись имеет собственный уникальный идентификатор, который очень часто используется в качестве первичного ключа.
Данные типа BLOB (Binary Large OBject) представляют собой двоичные массивы произвольной длины. В самом поле содержится лишь ссылка на отдельный файл базы данных, в котором хранится двоичный массив. Таким образом, поля типа BLOB являются универсальным носителем любых данных, которые имеют скалярную и нескалярную структуру и которые можно преобразовать в двоичное представление.
Тип Memo представляет собой набор строк произвольной длины (его разновидность — форматированный Memo), основан на формате BLOB. Используется при необходимости сохранить текст из компонента тмето или из текстового редактора.
Графический тип данных используется для хранения в базе данных изображений, основан на формате BLOB. Поле TGraphicFieid непосредственно взаимодействует с компонентом отображения данных (например TDBimage). Изображения должны храниться в формате BMP.
Типы данных ParadoxOle и dBaseOle разработаны специально для использования возможностей СУБД Paradox и dBASE по работе с данными OLE. В Delphi эти типы данных основаны на формате BLOB.
Специально для работы с сервером Oracle 8 предназначены типы CLOB и BLOB.
Тип ftArray организует массив из данных любой структуры, за исключением таких же массивов. Для каждого элемента массива может создаваться собственный объект TField. Для управления этим механизмом используется свойство SparseArrays в классе TDataSet.
В качестве отдельного поля в набор данных можно включить и любой другой произвольный набор данных. Для этого используется специальный тип данных и класс TDataSetField. Причем каждым полем из интегрированного набора данных тоже можно управлять.
Ссылочный тип данных также использует внешние наборы данных, но в этом случае можно подключать и использовать только отдельные поля.