Delphi для профессионалов

         

Типы данных


В среде разработки 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. Причем каждым полем из интегрированного набора данных тоже можно управлять.

Ссылочный тип данных также использует внешние наборы данных, но в этом случае можно подключать и использовать только отдельные поля.

 

Содержание раздела