Я учусь использовать 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;
Большое спасибо, Брайан.
Вы можете использовать класс [ '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
@TLama: Это сработало для меня и показалось бы «правильным», спасибо. После того, как вы перешли по ссылке на документацию по FD, я наткнулся на прекрасный пример проекта в «C: \ Users \ Public \ Documents \ RAD Studio \ 12.0 \ Samples \ Delphi \ Database \ FireDAC \ Samples \ Comp Layer \ TFDMetaInfoQuery", который делает в значительной степени все. Почему, почему мы не можем получить подробный список примеров Delphi и что они делают! –
Добро пожаловать! Да, это, кажется, лучший подходящий компонент для вашей задачи. И да, было бы неплохо иметь список примеров. – TLama