2014-01-09 3 views
4

Я учусь использовать SQLite и FireDAC вместе в Delphi. Я не очень разбираюсь в новейших воплощениях баз данных и инструментов, поэтому, написав очень простое приложение для отображения одной таблицы из файла SQLite, я решил, что я собрал бы простой «кадр» зрителя, который поможет мне учиться и, возможно, дайте мне (в конечном итоге) инструмент для отладки, чтобы разместить мое приложение для инженерного использования.Как использовать FireDAC TFDConnection для итерации по таблицам, полям и определениям полей

Итак, я использовал простой TTreeView, и я хочу заполнить его иерархией «баз данных» (каталоги?), «Таблиц», «названий полей» и «типов полей». До сих пор было замечательно легко перечислять каталоги, таблицы и поля (используя TFDConnection.Getxxxxx), но я не могу понять, как глубже углубиться в определение полей. Можно ли это сделать из TFDConnection? Или мне нужно открыть временный запрос?

Мой существующий код показан ниже, и мои «типы полей» будет дополнительно вложенного цикла, когда показано, как «// xxxxxxxxxxxxxxxxxxx»

procedure TForm1.Button1Click(Sender: TObject); 

    procedure DatabaseToTreeView(AConnection : TFDConnection; ATreeView : TTreeView); 

    procedure ProcessConnection; 

     procedure ProcessCatalogueName(const ACatalogueName : string; ARoot : TTreeNode); 

     procedure ProcessTableName(const ATableName : string; ARoot : TTreeNode); 
     var 
      List : TStrings; 
      {Node : TTreeNode;} 
      I : integer; 
     begin 
      List := TStringList.Create; 
      try 
      AConnection.GetFieldNames(ACatalogueName, '', ATableName, '', List); 
      for I := 0 to List.Count-1 do 
       begin 
       {Node := }ATreeView.Items.AddChild(ARoot, List[I]); 
       // xxxxxxxxxxxxxxxxxxx 
       end; 
      finally 
      List.Free; 
      end; 
     end; 

     var 
     List : TStrings; 
     Node : TTreeNode; 
     I : integer; 
     begin 
     List := TStringList.Create; 
     try 
      AConnection.GetTableNames(ACatalogueName, '', '', List); 
      for I := 0 to List.Count-1 do 
      begin 
      Node := ATreeView.Items.AddChild(ARoot, List[I]); 
      ProcessTableName(List[I], Node); 
      end; 
     finally 
      List.Free; 
     end; 
     end; 


    var 
     List : TStrings; 
     Node : TTreeNode; 
     I : integer; 
    begin 
     List := TStringList.Create; 
     try 
      AConnection.GetCatalogNames('', List); 

      if List.Count = 0 then 
      ProcessCatalogueName('', nil) 
      else 
      for I := 0 to List.Count-1 do 
       begin 
       Node := ATreeView.Items.AddChild(nil, List[I]); 
       ProcessCatalogueName(List[I], Node); 
       end; 
     finally 
      List.Free; 
     end; 
    end; 


    begin 
    ATreeView.Items.Clear; 
    ATreeView.Items.BeginUpdate; 
    try 
     ProcessConnection; 
    finally 
     ATreeView.Items.EndUpdate; 
    end; 
    end; 

begin 
    FDConnection1.Open; 
    FDQuery1.Active := true; 

    DatabaseToTreeView(FDConnection1, TreeView1); 

end; 

Большое спасибо, Брайан.

+1

Вы можете использовать класс [ 'TADMetaInfoQuery'] (http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile=uADCompClient_TADMetaInfoQuery.html) и запросить' тип mkTableFields' из [ 'MetaInfoKind'] (http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile=uADCompClient_TADMetaInfoQuery_MetaInfoKind.html). Это вернет вам 'COLUMN_DATATYPE' и' COLUMN_TYPENAME' (см. Главу ['Структура метаданных'] (http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile=Metadata_Structure.html)). – TLama

+0

@TLama: Это сработало для меня и показалось бы «правильным», спасибо. После того, как вы перешли по ссылке на документацию по FD, я наткнулся на прекрасный пример проекта в «C: \ Users \ Public \ Documents \ RAD Studio \ 12.0 \ Samples \ Delphi \ Database \ FireDAC \ Samples \ Comp Layer \ TFDMetaInfoQuery", который делает в значительной степени все. Почему, почему мы не можем получить подробный список примеров Delphi и что они делают! –

+0

Добро пожаловать! Да, это, кажется, лучший подходящий компонент для вашей задачи. И да, было бы неплохо иметь список примеров. – TLama

ответ

1

Одним из решений является создание экземпляра TFDTable, подключение его к подключению и вызов FieldDefs.Update. Это не даст никаких данных.

+0

Спасибо за предложение, но это работает, только если я заменил Table.FieldDefs.Update на Table.Active: = True. Я делаю только Table.Connection = xxx и Table.TableName: = ATableName, хотя есть другое поле, которое я должен инициализировать? –

0

Вместо использования временного запроса с ложным условием для получения схемы таблицы без каких-либо данных (например, «select * from tablename where 1 = 0» - я предполагаю, что это то, что вы имели в виду), в зависимости от вашей базы данных, вы также может использовать запрос для получения информации о таблице. Подобно;

Для MySQL:

show columns from tablename; 

Для SQLite:

PRAGMA table_info(tablename) 

Для MS SQL Server:

select column_name, data_type, character_maximum_length from INFORMATION_SCHEMA.COLUMNS where table_name = 'tablename'; 

Я считаю, что PostgreSQL также имеет такую ​​функцию, однако я не имею Установка pgsql удобна в настоящее время.

1

Используйте компонент TFDMetaInfoQuery. Он унифицирован для получения информации метаданных, поэтому его можно использовать с любыми поддерживаемыми СУБД. Он заполняет metadata resultsets запрошенным MetaInfoKind и предоставляет описание объекта СУБД.

Смежные вопросы