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

Вниз

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

 
Engel   (2003-02-01 20:34) [0]

Если с именами все просто:
ADOTable1.GetFieldNames(StringList1);
и дальше:
Table1.FieldByName("Qfieldname").AsString :=StringList1[j];
то с типом поля непонятно. в справке написано следующее:
Read the DataType property to learn the type of the data the field contains.
При вот такой строке:
Table1.FieldByName("Qfieldtype").AsString := adotable1.Fields[j].datatype;
ругается на тип значения. Что тут можно сделать? что-то сообразить не могу.


 
sniknik   (2003-02-01 20:48) [1]

Понятное дело ругается присваиваеш строке Table1.FieldByName("Qfieldtype").AsString
тип неизвестно какого поля adotable1.Fields[j].datatype

Table1.FieldByName("Qfieldtype") возврашает поле у него и можно узнать тип этого поля (то что обрашаешся как к строке не значит что поле например не INTEGER)
попробуй тип так посмотреть
Table1.FieldByName("Qfieldtype").DataType


 
Engel   (2003-02-01 21:43) [2]

Мне нужно занести в таблицу table1 название поля и его тип, а не значение этого поля.
ADOConnection1.GetTableNames(SL, False);
for i:= 0 to (SL.Count - 1) do
begin
ADOTable1.TableName := SL[i];
ADOTable1.Open;
ADOTable1.GetFieldNames(SL1);
for j:= 0 to (SL1.Count - 1) do
begin
Table1.Insert;
Table1.FieldByName("QTablename").AsString :=SL[i];
Table1.FieldByName("Qfieldname").AsString :=SL1[j];
Table1.FieldByName("Qfieldtype").Asvariant := adotable1.Fields[j].datatype;
Table1.FieldByName("Qfieldlen").Asvariant :=adotable1.Fields[j].size;
Table1.Post;
end;
ADOTable1.Close;
end;

Вопрос в том, что нужно перевести тип tfieldtype в тип string.
Сделала пока так:
Table1.FieldByName("Qfieldtype").Asvariant := adotable1.Fields[j].datatype;
В итоге в поле записывается порядковый номер типа в описании tfieldtype. Наверно, сделаю через case of, мне все равно нужны типы в формате memo, string...и тд, а не их исходные названия.


 
sniknik   (2003-02-02 00:15) [3]

заведи себе масив типов с их названиями ну например

const
StatusText : array [SERVICE_STOPPED..SERVICE_PAUSED] of string =
("Stopped", "Starting", "Stopping", "Started", "Restarting", "Pausing", "Paused");

обрашатся

Statustext[EnumServiceStatus.ServiceStatus.dwCurrentState]

и если бы я это хотел записать в базу тогда можно было бы присвоить

Table1.FieldByName("Qfieldtype").Asvariant:= Statustext[EnumServiceStatus.ServiceStatus.dwCurrentState];

потому что получится масив строк, а не тип интежер или перечисление. ????? Ок?

можно конечно и в case и даже через if, но мне так не нравится.


 
Engel   (2003-02-02 12:09) [4]

Можно конечно через массив, но я уже сделала через case of :)
и присваиваю вот так вот:
Table1.FieldByName("Qfieldtype").Asvariant := adotable1.Fields[j].datatype;
Table1.FieldByName("Qfieldtype").Asstring := getftype(Table1.FieldByName("Qfieldtype").Asinteger);
где getftype - функция выбора текста по номеру типа.
Но что-то мне подсказывает, что наверняка можно выцарапать тип поля гораздо проще, уже имеющимися методами у tfield.


 
MsGuns   (2003-02-02 15:16) [5]

TFieldDef[i].DataType,Precision,Size,...


 
Engel   (2003-02-03 00:35) [6]

Все равно номер типа в последовательности выдает.


 
sniknik   (2003-02-03 01:59) [7]

Естественно потому как оно не стринг, уже обсуждали, как вариант записывай в таблицу в том виде как есть, а перед показом в таблице по onGetText меняй на строку, (заодно и табличка поменьше будет). Не пойдет?

Пример как подменить есть в стандартном примере дельфи AdoTest примерно здесь
D:\Program Files\Borland\Delphi6\Demos\Ado\AdoTest

процедура
procedure TADODBTest.FieldSchemaDATA_TYPEGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
case FieldSchemaData_TYPE.Value of
$00000000: Text := "adEmpty";
$00000010: Text := "adTinyInt";
$00000002: Text := "adSmallInt";
$00000003: Text := "adInteger";
$00000014: Text := "adBigInt";
$00000011: Text := "adUnsignedTinyInt";
$00000012: Text := "adUnsignedSmallInt";
$00000013: Text := "adUnsignedInt";
$00000015: Text := "adUnsignedBigInt";
$00000004: Text := "adSingle";
$00000005: Text := "adDouble";
$00000006: Text := "adCurrency";
$0000000E: Text := "adDecimal";
$00000083: Text := "adNumeric";
$0000000B: Text := "adBoolean";
$0000000A: Text := "adError";
$00000084: Text := "adUserDefined";
$0000000C: Text := "adVariant";
$00000009: Text := "adIDispatch";
$0000000D: Text := "adIUnknown";
$00000048: Text := "adGUID";
$00000007: Text := "adDate";
$00000085: Text := "adDBDate";
$00000086: Text := "adDBTime";
$00000087: Text := "adDBTimeStamp";
$00000008: Text := "adBSTR";
$00000081: Text := "adChar";
$000000C8: Text := "adVarChar";
$000000C9: Text := "adLongVarChar";
$00000082: Text := "adWChar";
$000000CA: Text := "adVarWChar";
$000000CB: Text := "adLongVarWChar";
$00000080: Text := "adBinary";
$000000CC: Text := "adVarBinary";
$000000CD: Text := "adLongVarBinary";
$00000088: Text := "adChapter";
$00000040: Text := "adFileTime";
$00000089: Text := "adDBFileTime";
$0000008A: Text := "adPropVariant";
$0000008B: Text := "adVarNumeric";
else
Text := "<Unknown>";
end;
end;



 
Engel   (2003-02-03 23:05) [8]

Спасибо, Sniknik
Но ведь сделала уже. И написала как:
Table1.FieldByName("Qfieldtype").Asvariant := adotable1.Fields[j].datatype;
Table1.FieldByName("Qfieldtype").Asstring := getftype(Table1.FieldByName("Qfieldtype").Asinteger);
где getftype - функция выбора текста по номеру типа. Функция такая:
function tform1.getftype (a:integer):string;
begin
case a of
0: result:="Unknown";
1: result:="String";
2: result:="Smallint";
3: result:="Integer";
итд.
А таблица все равно создается динамически, ибо нужна только для распечатки отчета.


 
sniknik   (2003-02-03 23:31) [9]

Ну хоть чтото улутшить :-))), а то даже обидно, сама дошла ничего из моего не используеш ;о(.

вместо 2 строк в одну
Table1.FieldByName("Qfieldtype").AsString := getftype(Integer(adotable1.Fields[j].datatype));

или без приведения типа функцию по другому
function getftype (a: TFieldType):string;
begin
case a of
ftUnknown: result:="Unknown";
ftString: result:="String";
ftSmallint: result:="Smallint";
ftInteger: result:="Integer";
итд.

тогда
Table1.FieldByName("Qfieldtype").AsString := getftype(adotable1.Fields[j].datatype);


 
Engel   (2003-02-03 23:52) [10]

Во, а за эту мысль спасибо!!!
сейчас попробую :)



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

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

Наверх





Память: 0.48 MB
Время: 0.007 c
3-63563
Nickus1
2003-02-03 23:06
2003.02.20
Использование DBComboBox


1-63678
NOE
2003-02-11 17:22
2003.02.20
Отрезок времени меньше 1 милисекунды


14-63763
gsu
2003-02-03 10:49
2003.02.20
Вопрос, совет, ...


1-63649
SeNtiMeL
2003-02-11 21:08
2003.02.20
Чтение из TMemoryStream.....


14-63798
KonstVD
2003-02-04 09:01
2003.02.20
2 рубЛЯ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский