Главная страница
    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.138 c
1-63670
vladislav80
2003-02-11 13:11
2003.02.20
Как запихнуть avi файл в файл ресурсов?


14-63834
Sasha9
2003-02-01 14:34
2003.02.20
хелп в дельфи не пашет!!!!!!!!!!!!!!!!!!!!


3-63564
Антон
2003-02-03 23:08
2003.02.20
Подскажите кто может


14-63808
Ундервуд
2003-02-04 11:43
2003.02.20
Компы DirectX для сетевого обмена с помощью <b>DirectPlay</b>


6-63697
alev
2002-12-29 01:45
2003.02.20
Сканер портов





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