4

我正在教自己在 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;

非常感谢,布赖恩。

4

3 回答 3

1

一种解决方案是实例化一个 TFDTable,将其连接到 AConnection 并调用 FieldDefs.Update。这不会获取任何数据。

于 2014-01-09T16:26:22.940 回答
1

使用TFDMetaInfoQuery组件。它统一用于获取元数据信息,因此可与任何类型的受支持的 DBMS 一起使用。它通过请求的MetaInfoKind和给定的 DBMS 对象描述填充元数据结果集。

于 2017-06-27T06:09:00.857 回答
0

而不是使用带有错误条件的临时查询来获取没有任何数据的表模式(例如“select * from tablename where 1=0” - 我假设这就是你的意思),取决于你的数据库,你也可以使用查询以获取表信息。喜欢;

对于 MySQL:

show columns from  tablename;

对于 SQLite:

PRAGMA table_info(tablename)

对于 MS SQL 服务器:

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

我相信 PostgreSQL 也有这样的功能,但是我现在没有方便的 pgsql 安装。

于 2014-07-25T07:50:27.840 回答