我正在教自己在Delphi中一起使用SQLite和FireDAC。我对数据库和工具的最新版本不是很有经验,所以在编写一个非常简单的应用程序来显示SQLite文件中的单个表之后,我决定将一个简单的查看器框架组合在一起。这将有助于我学习,并可能给我(最终)一个调试工具,以放入我的工程应用程序。
所以,我使用了一个简单的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;
非常感谢,Brian。
答案 0 :(得分:1)
一种解决方案是实例化TFDTable,将其连接到AConnection并调用FieldDefs.Update。这不会获取任何数据。
答案 1 :(得分:1)
使用TFDMetaInfoQuery组件。它统一用于获取元数据信息,因此可用于任何类型的受支持DBMS。它按请求的metadata resultsets和给定的DBMS对象描述填充MetaInfoKind。
答案 2 :(得分:0)
而不是使用带有false条件的临时查询来获取没有任何数据的表模式(例如" select * from tablename,其中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安装。