Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Структура таблицы SQL сервера


Автор: LexuSS 22.7.2009, 14:44
Подключаюсь к SQL-серверу (2000) через ADO, перебираю таблицы для поиска подходящей.
Как узнать структуру таблицы на которую установлен фокус?
Заранее спасибо!!!

Автор: Данкинг 22.7.2009, 15:53
В смысле - список полей получить, что ли?

Автор: Akella 22.7.2009, 20:33
Не, ему нужен список полей с их свойствами, наверное.

Добавлено через 4 минуты и 57 секунд
В ADODataset загрузи таблицу например так:
Код

ADODataset1.CommandText := 'select * from table1 where id = -1';
ADODataset.Open;

А теперь цикл по всем полям набора данных.
where id = -1 нужно для того, чтобы в набор данных не попало ни одной записи, т.е. у тебя будут только поля (записи нам не нужны).
where id = -1 замени на своё условие.

Автор: Данкинг 22.7.2009, 20:48
Akella, не понял, а чем просто AdoTable.Fields[]..... плохо?

Автор: Akella 22.7.2009, 21:59
Эм... всмысле, а чем плохо? Расскажи, чем плохо?

Автор: Данкинг 22.7.2009, 22:10
Я просто не понял, зачем запрос на выборку делать?

Автор: LexuSS 23.7.2009, 06:42
Мне нужно узнать тип каждого поля поля (то есть число, текст или логическое поле).
Список плей найти не сложно....

Автор: Akella 23.7.2009, 10:38
Цитата(LexuSS @  23.7.2009,  06:42 Найти цитируемый пост)
Мне нужно узнать тип каждого поля поля

Ну так узнавай, в чём же дело. Или клавиша f1 выламана?

Автор: insoft 23.7.2009, 17:51
ну я бы сделал так
Код

function AccessType(fd:TFieldDef):string;
begin
 case fd.DataType of
  ftString: Result:='TEXT('+IntToStr(fd.Size)+')';
  ftSmallint: Result:='SMALLINT';
  ftInteger: Result:='INTEGER';
  ftWord: Result:='WORD';
  ftBoolean: Result:='YESNO';
  ftFloat : Result:='FLOAT';
  ftCurrency: Result := 'CURRENCY';
  ftDate, ftTime, ftDateTime: Result := 'DATETIME';
  ftAutoInc: Result := 'COUNTER';
  ftBlob, ftGraphic: Result := 'LONGBINARY';
  ftMemo, ftFmtMemo: Result := 'MEMO';
 else
  Result:='MEMO';
 end;
end;


ну а использовать проще простого
Код

var
  i:integer;
  s:string;
begin
 with NameTable.FieldDefs do
   begin
     for i:=0 to Count-1 do
       begin
         s:=s + ' ' + Items[i].Name;
         s:=s + ' ' + AccessType(Items[i]);
         s:=s + ',';
       end;
   end;

 Memo1.Clear;
 Memo1.lines.Add (s);

Автор: kobra 23.7.2009, 21:44
Код

ADODataset1.CommandText := 'select top 0 * from table1';
ADODataset.Open;
пустой запрос наверно луще так делать smile

структуру таблицы можно запросом из служебных таблиц (не рекомендуется). это самый наглядный вариант, но нужны соответствуищие права.

запросом из служебных видов или хранимои процедуры.

связать с таблицей AdoTable и проитис в цикле по полям.

Автор: LexuSS 24.7.2009, 08:36
Большое спасибо!!!
Всё получилось, а запросом к какой служебной табличке можно?
прав достаточно... смотрел в них но не понял как поле к таблице привязывается. что там еще можно узнать?

Автор: kobra 24.7.2009, 09:09
как уже писал, в таблицы лазить не рекомендуется.
правилный подход - ползоватся видами или процедурами
dbo.sp_databases
dbo.sp_tables
dbo.sp_columns
INFORMATION_SCHEMA.COLUMNS
INFORMATION_SCHEMA.TABLES
если залезиш, там ещо много интересного smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)