Как узнать тип поля?
Как узнать тип поля?
Привет всем!
Как узнать тип поля для данной таблицы в запросе?
Заранее спасибо!
Как узнать тип поля для данной таблицы в запросе?
Заранее спасибо!
то есть чтобы узнать тип одного поля в данной таблице я должен
создать запрос
SELECT R.RDB$RELATION_NAME, R.RDB$FIELD_NAME, F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE
FROM RDB$FIELDS F, RDB$RELATION_FIELDS R
WHERE F.RDB$FIELD_NAME = 'MyFieldName' AND R.RDB$RELATION_NAME = 'MyTableName' AND R.RDB$SYSTEM_FLAG = 0
где MyFieldName,MyTableName переменные типа String
я прав?
создать запрос
SELECT R.RDB$RELATION_NAME, R.RDB$FIELD_NAME, F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE
FROM RDB$FIELDS F, RDB$RELATION_FIELDS R
WHERE F.RDB$FIELD_NAME = 'MyFieldName' AND R.RDB$RELATION_NAME = 'MyTableName' AND R.RDB$SYSTEM_FLAG = 0
где MyFieldName,MyTableName переменные типа String
я прав?
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Не совсем. Во-первых, имена надо писать большими буквами (если только они у тебя не регистрочувствительные), а во-вторых - читай вторую часть фразы kdv: кроме того, после prepare тип выходных столбцов сообщается сервером клиенту.
Ответы могли бы быть точнее если бы ты сообщил нам когда и зачем тебе нужен тип поля. Я как-то сходу не могу придумать такую задачу...
Ответы могли бы быть точнее если бы ты сообщил нам когда и зачем тебе нужен тип поля. Я как-то сходу не могу придумать такую задачу...
-
- Сообщения: 41
- Зарегистрирован: 27 окт 2004, 11:06
Навскидку - универсальная форма для ввода параметров ХП или форма, редактирующая одну запись в табличке. (Развивая мысль - если тип поля блоб - нужно предусмотреть возможность Load/Save в файл и т.п.)Dimitry Sibiryakov писал(а): Ответы могли бы быть точнее если бы ты сообщил нам когда и зачем тебе нужен тип поля. Я как-то сходу не могу придумать такую задачу...
мне нужна функция возвращающая тип поля для дальнейшей работы
с ним. что то вроде этого
вопрос как мне достучаться до определенного поля! т.е. передать параметр FieldName как я делал в примере для оракла , приведенном выше.
с ним. что то вроде этого
Код: Выделить всё
Function GetFieldType(TableName,FieldName: String): TFieldType;
Var
ExecQuery : TQuery;
ExecQuery1 : TQuery;
FieldScale : Integer;
Begin
GetFieldType := ftString;
ExecQuery := TQuery.Create(Nil);
ExecQuery.DatabaseName :=MainAlias
// for INTERBASE !!!
ExecQuery.SQL.Add('SELECT R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME,');
ExecQuery.SQL.Add('F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE ');
ExecQuery.SQL.Add('FROM RDB$FIELDS F, RDB$RELATION_FIELDS R ');
ExecQuery.SQL.Add('WHERE R.RDB$RELATION_NAME ='+''''+TableName+''''+ 'AND F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE AND R.RDB$SYSTEM_FLAG = 0 ');
// for ORACLE !!!
{ExecQuery.SQL.Add('SELECT DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '+''''+TableName+''''+
' AND COLUMN_NAME = '+''''+FieldName+''''); }
ExecQuery.Open;
If ExecQuery.FieldByName('RDB$FIELD_TYPE').AsString = 'VARCHAR' Then
GetFieldType := ftString
Else
If ExecQuery.FieldByName('RDB$FIELD_TYPE').AsString = 'NUMBER' Then
Begin { FOR SCALING FIELD}
ExecQuery1 := TQuery.Create(Nil);
ExecQuery1.DatabaseName := MainAlias
ExecQuery1.SQL.Add('SELECT R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME,');
ExecQuery1.SQL.Add('F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE AS YYY ');
ExecQuery1.SQL.Add('FROM RDB$FIELDS F, RDB$RELATION_FIELDS R ');
ExecQuery1.SQL.Add('WHERE R.RDB$RELATION_NAME ='+''''+TableName+''''+ 'AND F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE AND R.RDB$SYSTEM_FLAG = 0 ');
ExecQuery1.Open;
FieldScale:=ExecQuery1.FieldByName('YYY').AsInteger;
IF FieldScale = 0 then
GetFieldType := ftInteger
Else
GetFieldType := ftFloat;
ExecQuery1.Close;
ExecQuery1.Free;
End
Else
If ExecQuery.FieldByName('RDB$FIELD_TYPE').AsString = 'TIMESTAMP' Then
GetFieldType := ftDateTime;
ExecQuery.Close;
ExecQuery.Free;
End;
есть системные таблицы, есть документ
www.ibase.ru/devinfo/sysqry.htm
что тебе еще надо??? код за тебя написать?
www.ibase.ru/devinfo/sysqry.htm
что тебе еще надо??? код за тебя написать?
нашел.
запрос по ОДНОМУ полю в таблице
select R.RDB$RELATION_NAME, R.RDB$FIELD_NAME,
F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE
from RDB$FIELDS F, RDB$RELATION_FIELDS R
where R.RDB$FIELD_SOURCE = 'MyFieldName' and R.RDB$RELATION_NAME = 'MYTABLE' and R.RDB$SYSTEM_FLAG = 0
order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION
спасибо за помощь.
запрос по ОДНОМУ полю в таблице
select R.RDB$RELATION_NAME, R.RDB$FIELD_NAME,
F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE
from RDB$FIELDS F, RDB$RELATION_FIELDS R
where R.RDB$FIELD_SOURCE = 'MyFieldName' and R.RDB$RELATION_NAME = 'MYTABLE' and R.RDB$SYSTEM_FLAG = 0
order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION
спасибо за помощь.
order by тут не нужен, раз одну запись вынимаешь.
кроме того, where некорректный.
В том смысле, что ты так и не понял, что находится в rdb$relations:
rdb$field_name - ИМЯ СТОЛБЦА В ТАБЛИЦЕ
rdb$field_source - имя "домена", который является источником для столбца, из rdb$fields.
и, разумеется, таблицы rdb$fields и rdb$relation_fields надо связать по имени field_source.
кроме того, where некорректный.
В том смысле, что ты так и не понял, что находится в rdb$relations:
rdb$field_name - ИМЯ СТОЛБЦА В ТАБЛИЦЕ
rdb$field_source - имя "домена", который является источником для столбца, из rdb$fields.
и, разумеется, таблицы rdb$fields и rdb$relation_fields надо связать по имени field_source.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
и действительно - все решаеться очень просто
Function GetFieldType(TableName,FieldName: String): TFieldType;
Var
ExecQuery : TQuery;
Begin
GetFieldType := ftString;
ExecQuery := TQuery.Create(Nil);
ExecQuery.DatabaseName :=MainAlias;
ExecQuery.SQL.Add('SELECT * FROM ' + TableName);
ExecQuery.Prepare;
ExecQuery.Open;
GetFieldType := ExecQuery.FieldByName(FieldName).DataType;
end;
Function GetFieldType(TableName,FieldName: String): TFieldType;
Var
ExecQuery : TQuery;
Begin
GetFieldType := ftString;
ExecQuery := TQuery.Create(Nil);
ExecQuery.DatabaseName :=MainAlias;
ExecQuery.SQL.Add('SELECT * FROM ' + TableName);
ExecQuery.Prepare;
ExecQuery.Open;
GetFieldType := ExecQuery.FieldByName(FieldName).DataType;
end;
раз пошла такая пьянка хочу задать еще один вопрос
можно ли получить Primary Index Name через тот же Prepare.
если нет то как это сделать через системные таблицы (кстати это возможность дополнить прекрасный документ www.ibase.ru/devinfo/sysqry.htm )
можно ли получить Primary Index Name через тот же Prepare.
если нет то как это сделать через системные таблицы (кстати это возможность дополнить прекрасный документ www.ibase.ru/devinfo/sysqry.htm )
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05