Delphi анализ схемы данных базы данных (определение типа столбца в таблице)

Получить информацию о схеме данных базы данных в Delphi можно осуществить при помощи технологии ADO, которая позволяет подключаться к различным СУБД используя механизм ODBC драйверов. Для получения схемы данных необходимо выполнить AdoConnection.OpenSchema с соответствующими параметрами и получить в датасет список требуемой информации о схеме данных. Можно было бы делать запросы к системным таблицам СУБД для этого, но это делало бы код сильно привязанным к определенным СУБД и его версия, этот аргумент куда весомее аргумента против, что универсальный механизм будет медленнее работать с самой СУБД. Необходимо было по заданному имени таблицы определить список ее полей определить тип поля и поставить в ему тип данных Delphi, а также для всех возможных значений TFieldType получить по его значению, его строковое значение, например, для ftString получить строку ‘ftString’. Кроме того для каждого поля необходимо было получить тип поля датасета при доступе к полю через FieldByName(‘’), т.е. для ftString получить строку ‘AsString’. Как оказалось стандартных функций для выполнения подобных операций не было. В некотором роде близка была функция из юнита ADODB ADOTypeToFieldType которая конвертировала типы базы данных в типы данных TFieldType, но разработчики технологии решили что эти функции не потребуются другим программистам и не поместили заголовок этой функции в раздел interface ADOBD . Дело в том, что функция OpenSchema возвращает тип поля который соответствует стандартным типам полей получаемых из Ole объектов, которые взаимодействуют с ODBC драйверами в самой операционной системе. Такое преобразование было необходимо поскольку работаю я через технологию ADO, да и привычнее TFieldType, чем стандартизированные типы данных. Править стандартные библиотеки дело не благодарное, а функция такая была необходима, поэтому пришлось скопировать к себе в отдельный юнит утилит данную функцию.

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

Ниже приведены функции и описание что каждая из них делает. При использовании обязательно необходимо включить в список uses юниты DB, ADOInt.

interface

uses DB, ADOInt;

 

{Конвертирует стандартный тип поля, извлекаемый при выполнении

OpenSchema ADO, в стандартный тип поля TFieldType}

function ADOTypeToFieldType(const ADOType: DataTypeEnum

; EnableBCD: Boolean = True): TFieldType;

{Функция, возвращающая типа данных Pascal (Delphi), по его типу TFieldType}

function GetStrTypeByFieldType(AFieldType: TFieldType): string;

{Возвращает по TFieldType его щназвание в строков виде }

function GetStrFielsTypeByFieldType(AFieldType: TFieldType): string;

{Возвращает по TFieldType строку которая соответвует єтому типа при присвоении

переменой, т.е. для ftInteger вернет AsInteger}

function GetStrFieldValueTypeByFieldType(AFieldType: TFieldType): string;

 

implementation

 

function ADOTypeToFieldType(const ADOType: DataTypeEnum

; EnableBCD: Boolean = True): TFieldType;

begin

case ADOType of

adEmpty: Result := ftUnknown;

adTinyInt, adSmallInt: Result := ftSmallint;

adError, adInteger, adUnsignedInt: Result := ftInteger;

adBigInt, adUnsignedBigInt: Result := ftLargeInt;

adUnsignedTinyInt, adUnsignedSmallInt: Result := ftWord;

adSingle, adDouble: Result := ftFloat;

adCurrency: Result := ftBCD;

adBoolean: Result := ftBoolean;

adDBDate: Result := ftDate;

adDBTime: Result := ftTime;

adDate, adDBTimeStamp, adFileTime, adDBFileTime: Result := ftDateTime;

adChar: Result := ftFixedChar;

adVarChar: Result := ftString;

adWChar: Result := ftFixedWideChar;

adBSTR, adVarWChar: Result := ftWideString;

adLongVarChar: Result := ftMemo;

adLongVarWChar: Result := ftWideMemo;

adLongVarBinary: Result := ftBlob;

adBinary: Result := ftBytes;

adVarBinary: Result := ftVarBytes;

adChapter: Result := ftDataSet;

adPropVariant, adVariant: Result := ftVariant;

adIUnknown: Result := ftInterface;

adIDispatch: Result := ftIDispatch;

adGUID: Result := ftGUID;

adDecimal, adNumeric, adVarNumeric:

if EnableBCD then Result := ftBCD

else Result := ftFloat;

else

Result := ftUnknown;

end;

end;

 

function GetStrTypeByFieldType(AFieldType: TFieldType): string;

begin

case AFieldType of

ftUnknown, ftVarBytes, ftBlob, ftGraphic, ftParadoxOle

, ftDBaseOle, ftTypedBinary, ftCursor, ftADT, ftArray

, ftReference, ftDataSet, ftOraClob, ftInterface, ftIDispatch, ftGuid

, ftTimeStamp, ftFMTBcd, ftOraTimeStamp, ftOraInterval: Result:= ”;

ftString, ftMemo, ftFmtMemo, ftFixedChar, ftWideString

, ftFixedWideChar, ftWideMemo: Result:= ‘string';

ftSmallint, ftInteger, ftWord, ftBytes, ftAutoInc

, ftLargeint: Result:= ‘Integer';

ftBoolean: Result:= ‘Boolean';

ftFloat, ftCurrency, ftBCD: Result:= ‘double';

ftDate: Result:= ‘TDate';

ftTime: Result:= ‘TTime';

ftDateTime: Result:= ‘TDateTime';

ftVariant: Result:= ‘Variant';

else

Result:= ”;

end;

end;

 

function GetStrFielsTypeByFieldType(AFieldType: TFieldType): string;

begin

case AFieldType of

ftUnknown: Result:= ‘ftUnknown';

ftVarBytes: Result:= ‘ftVarBytes';

ftBlob: Result:= ‘ftBlob';

ftGraphic: Result:= ‘ftGraphic';

ftParadoxOle: Result:= ‘ftParadoxOle';

ftDBaseOle: Result:= ‘ftDBaseOle';

ftTypedBinary: Result:= ‘ftTypedBinary';

ftCursor: Result:= ‘ftCursor';

ftADT: Result:= ‘ftADT';

ftArray: Result:= ‘ftArray';

ftReference: Result:= ‘ftReference';

ftDataSet: Result:= ‘ftDataSet';

ftOraClob: Result:= ‘ftOraClob';

ftInterface: Result:= ‘ftInterface';

ftIDispatch: Result:= ‘ftIDispatch';

ftGuid: Result:= ‘ftGuid';

ftTimeStamp: Result:= ‘ftTimeStamp';

ftFMTBcd: Result:= ‘ftFMTBcd';

ftOraTimeStamp: Result:= ‘ftOraTimeStamp';

ftOraInterval: Result:= ‘ftOraInterval';

ftString: Result:= ‘ftString';

ftMemo: Result:= ‘ftMemo';

ftFmtMemo: Result:= ‘ftFmtMemo';

ftFixedChar: Result:= ‘ftFixedChar';

ftWideString: Result:= ‘ftWideString';

ftFixedWideChar: Result:= ‘ftFixedWideChar';

ftWideMemo: Result:= ‘ftWideMemo';

ftSmallint: Result:= ‘ftSmallint';

ftInteger: Result:= ‘ftInteger';

ftWord: Result:= ‘ftWord';

ftBytes: Result:= ‘ftBytes';

ftAutoInc: Result:= ‘ftAutoInc';

ftLargeint: Result:= ‘ftLargeint';

ftBoolean: Result:= ‘ftBoolean';

ftFloat: Result:= ‘ftFloat';

ftCurrency: Result:= ‘ftCurrency';

ftBCD: Result:= ‘ftBCD';

ftDate: Result:= ‘ftDate';

ftTime: Result:= ‘ftTime';

ftDateTime: Result:= ‘ftDateTime';

ftVariant: Result:= ‘ftVariant';

else

Result:= ”;

end;

end;

 

function GetStrFieldValueTypeByFieldType(AFieldType: TFieldType): string;

begin

case AFieldType of

ftUnknown, ftVarBytes, ftBlob, ftGraphic, ftParadoxOle

, ftDBaseOle, ftTypedBinary, ftCursor, ftADT, ftArray

, ftReference, ftDataSet, ftOraClob, ftInterface, ftIDispatch, ftGuid

, ftTimeStamp, ftFMTBcd, ftOraTimeStamp, ftOraInterval: Result:= ”;

ftString, ftMemo, ftFmtMemo, ftFixedChar, ftWideString

, ftFixedWideChar, ftWideMemo: Result:= ‘AsString';

ftSmallint, ftInteger, ftWord, ftBytes, ftAutoInc

, ftLargeint: Result:= ‘AsInteger';

ftBoolean: Result:= ‘AsBoolean';

ftFloat, ftCurrency, ftBCD: Result:= ‘AsFloat';

ftDate: Result:= ‘AsDate';

ftTime: Result:= ‘AsTime';

ftDateTime: Result:= ‘AsDateTime';

ftVariant: Result:= ‘Value';

else

Result:= ”;

end;

end;

Share

Tags: , , ,

2 Responses to “Delphi анализ схемы данных базы данных (определение типа столбца в таблице)”

  1. samsim пишет:

    Да, очень качественный и полезный код. Автор постарался.

  2. спасибо за высокую оценку

Leave a Reply