Форум: "Базы";
Текущий архив: 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