Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];

Вниз

Процедура для определения типа столбца таблицы   Найти похожие ветки 

 
WeTeR   (2009-03-05 13:20) [0]

Допустим у нас есть таблица  N с количеством столбцов N и неизвестной разновидностью типов этих столбцов.
Нужно вывести на экран Имя таблицы, количество столбцов, и их типы?
Входные даные: Nt - индекс таблицы

Определение имени таблицы
s:=(datamodule1.FindComponent(Format(Nt+"%d",[It])) as TADOTAble).TableName;

Определение количества столбцов
i:=(datamodule1.FindComponent(Format(Nt+"%d",[It])) as TADOTAble).FieldCount;

Как определить тип столбца?
И как полученое занчение перевести в стринг ?

s:=(datamodule1.FindComponent(Format(Nt+"%d",[It])) as TADOTAble).Field.Fields[i].?????;

Или это делается по другому?


 
Ega23 ©   (2009-03-05 13:28) [1]

var
 at : TADOTable;
 i : Integer;
begin
 at := TADOTable(datamodule1.FindComponent(Format(Nt+"%d",[It])));
 Name := at.Name;
 FieldCount := IntToStr(at.fieldCount);

 for i:=0 to at.fieldCount-1 do
   case at.Fields[i].FieldType of
     ftInteger : ...
     ftString : ....
     ......
   end;

 
 
end;


 
kaif   (2009-03-08 13:07) [2]

Свойство ClassName имеет тип ShortString. Если этого достаточно, то можно просто вывести

s:=(datamodule1.FindComponent(Format(Nt+"%d",[It])) as TDataSet).Fields[i].ClassName.

Но я бы воспользовался свойством DataType, как и Ega23 предлагает (он просто ошибся - свойство DataType, а не FieldType. Хотя тип у него как раз TFieldType).

Я бы объявил массив строк с размерностью TFieldType и переписал бы туда кусок Help Delphi в кчастве явно заданных элементов для начала:

var
 MyFieldTypeNames: array[TFieldType] of string =
 (
   "tUnknown Unknown or undetermined",
   "ftString Character or string field",
   "ftSmallint 16-bit integer field",
   "ftInteger 32-bit integer field",
   "ftWord 16-bit unsigned integer field",
   "ftBoolean Boolean field",
   "ftFloat Floating-point numeric field",
   "ftCurrency Money field",
   "ftBCD Binary-Coded Decimal field that can be converted to Currency type without a loss of precision.",
   "ftDate Date field",
   "ftTime Time field",
   "ftDateTime Date and time field",
   "ftBytes Fixed number of bytes (binary storage)",

   "ftVarBytes Variable number of bytes (binary storage)",
   "ftAutoInc Auto-incrementing 32-bit integer counter field",
   "ftBlob Binary Large OBject field",
   "ftMemo Text memo field",
   "ftGraphic Bitmap field",
   "ftFmtMemo Formatted text memo field",
   "ftParadoxOle Paradox OLE field",
   "ftDBaseOle dBASE OLE field",
   "ftTypedBinary Typed binary field",
   "ftCursor Output cursor from an Oracle stored procedure (TParam only)",
   "ftFixedChar Fixed character field",
   "ftWideString Wide string field",
   "ftLargeint Large integer field",

   "ftADT Abstract Data Type field",
   "ftArray Array field",
   "ftReference REF field",
   "ftDataSet DataSet field",
   "ftOraBlob BLOB fields in Oracle 8 tables",
   "ftOraClob CLOB fields in Oracle 8 tables",
   "ftVariant Data of unknown or undetermined type",
   "ftInterface References to interfaces (IUnknown)",
   "ftIDispatch References to IDispatch interfaces",
   "ftGuid globally unique identifier (GUID) values",
   "ftTimeStamp Date and time field accessed through dbExpress",
   "ftFMTBcd Binary-Coded Decimal field that is too large for ftBCD");

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;

 ///
begin

 ///
 ds := TDataSet(datamodule1.FindComponent(Format(Nt+"%d",[It])));
 for i := 0 to ds.FieldCount - 1 do
   ShowMessage(MyFieldTypeNames[ds.Fields[i].DataType]);
end;


А потом назвал бы типы полей, как мне нравится.

Правда боюсь, что всего этого может оказаться мало для конкретной задачи.
Ведь обычно интересует не просто факт того, что поле BCD, но и какова точность. Или какова длина поля типа ftString в базе данных. Одним словом одних типов полей может оказаться недостаточно.


 
MsGuns ©   (2009-03-08 17:24) [3]

ADO "врет", не всегда точно сообщая типы данных в полях полученного нд. Гораздо точнее инфа о таблице, извлеченная непосредственно из метаданных БД.


 
Ega23 ©   (2009-03-11 10:03) [4]


> (он просто ошибся - свойство DataType, а не FieldType

Точно, ошибся. Прошу прощения. Просто писал прямо в браузере по памяти.


 
забыл   (2009-03-11 12:53) [5]

MsGuns ©   (08.03.09 17:24) [3]
Кстати, да.
Но какая разница, если он сможет читать/писать данные типа такого, как он тип этот определил?


 
Ega23 ©   (2009-03-11 13:00) [6]


> Но какая разница, если он сможет читать/писать данные типа
> такого, как он тип этот определил?


Попробуй прикола ради поработай с такими типами данных, как TDateTime и TGUID.
TDateTime с точностью до миллисекунд - через параметры не проходит. Приходится строкой фигачить.
TGUID - с ним тоже интересного дофига.


 
sniknik ©   (2009-03-11 13:20) [7]

> TDateTime с точностью до миллисекунд - через параметры не проходит.
тут не адо, тут вариант "виноват", это там тип DateTime с "пониженной" точностью. ну, а так как все значения идут через вариант...
да и в mssql/или delphi(? не помню точно, или там и там), миллисекунд на самом деле нет, а есть что то дискретное, 3-4 значения на секунду... типа 300, 600, 900 (не помню точно, и не хочется заново проверять) и все, попытаешься задать 001 мсек. и "обломаешься".

> TGUID - с ним тоже интересного дофига.
а с ним чего?


 
Ega23 ©   (2009-03-11 13:28) [8]


> да и в mssql/или delphi(? не помню точно, или там и там),
>  миллисекунд на самом деле нет, а есть что то дискретное,
>  3-4 значения на секунду... т


Опытным путём в своё время было установлено, что в MSSQL у datetime дискрет 3 миллисекунды.
Если точнее, то опять же опытным путём в миллисекундах младший разряд принимал всего 3 значения. Ну, типа, [0,3,7]. Или [2,5,8].
Что-то в таком духе.


> а с ним чего?

А то же самое - через строку. Причём с учётом скобочек...  :)

 TGuidField = class(TStringField)
 protected
   class procedure CheckTypeSize(Value: Integer); override;
   function GetAsGuid: TGUID;
   function GetDefaultWidth: Integer; override;
   procedure SetAsGuid(const Value: TGUID);
 public
   constructor Create(AOwner: TComponent); override;
   property AsGuid: TGUID read GetAsGuid write SetAsGuid;
 end;


 
sniknik ©   (2009-03-11 13:44) [9]

> что в MSSQL у datetime дискрет 3 миллисекунды.
ну значит это я про дельфи помню, там дискретность побольше.

> А то же самое - через строку.
зачем? если проблемы с типом (самому не требовалось) то почему бы не как binary(16) передавать? (то ли dblib, толи это в odbc, опять смутно помню т.к. только раз давно пришлось столкнуться. не было типа гуид, заменил на предложенное без всяких проблем. (по сути это одно и тоже))


 
Ega23 ©   (2009-03-11 13:47) [10]


> зачем?


Да я откуда знаю, зачем им так TGUIDField захотелось извратить?


 
sniknik ©   (2009-03-11 14:00) [11]

> зачем им так TGUIDField захотелось извратить?
? им, я вижу ты извращаешся.
и я понял отчего у тебя проблемы, там нет в общем списке AsGuid у фиелда (видать потому что он общий, и еще с bde), как и AsBlob впрочем...
а написать
var
 GUID: TGUID;
....
GUID:= TGuidField(ADODataSet1.FieldByName("GUID")).AsGuid;


не догадался.


 
Ega23 ©   (2009-03-11 14:05) [12]


> не догадался.


Почему? Именно так и делаю. Со вставкой проблемы - GuidToString приходится юзать.


 
MsGuns ©   (2009-03-11 16:16) [13]

Подобные "извраты" можно попробовать лечить прямым преобразованием непосредственно в запросе (CAST). Мне таким образом удается "уламывать" делфу не обрезать дроби до 4-х знаков (например вместо NUMERIC исп-ть FLOAT) :)


 
sniknik ©   (2009-03-11 16:59) [14]

> лечить прямым преобразованием непосредственно в запросе (CAST).
не нужно лечить,  [9] -> binary(16) понимает без преобразований.

а вообще ноги "глюков адо" с гуидом тоже торчат из варианта, посмотреть в TVarData и найти там guid... (хотя почему сделали через стринг (борланд похоже также передает доже при типе ftGuid), а не бинари, что имхо нормальнее, не понимаю)


 
Ega23 ©   (2009-03-11 17:06) [15]


> хотя почему сделали через стринг (борланд похоже также передает
> доже при типе ftGuid), а не бинари, что имхо нормальнее,
>  не понимаю


Вот для меня тоже загадка. У меня глаза на лоб полезли, когда я в GetSize увидел Result := 38  (аккурат строковое представление гуида с фигурными скобочками).


 
Правильный$Вася   (2009-03-11 18:15) [16]


> Гораздо точнее инфа о таблице, извлеченная непосредственно
> из метаданных БД.

это верно
но ведь не известно, какая типизация нужна автору - то, как оно в БД, или то, как оно видится из дельфи
а это две большие разницы, как говорится



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.007 c
2-1263991727
nordlink19
2010-01-20 15:48
2010.03.21
Рисование окружности в free pascal


2-1263675531
HRustBB
2010-01-16 23:58
2010.03.21
указатель на пременную THighlihter


1-1240936541
Igor2010
2009-04-28 20:35
2010.03.21
JavaScript+IHTMLWindows2


2-1263819343
Alexey
2010-01-18 15:55
2010.03.21
Размер большой папки


1-1242910957
Unknown user
2009-05-21 17:02
2010.03.21
TTypeInfo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский