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

1 つの解決策は、TFDTable をインスタンス化し、それを AConnection に接続して、FieldDefs.Update を呼び出すことです。これはデータを取得しません。

于 2014-01-09T16:26:22.940 に答える
0

データなしでテーブル スキーマを取得するために false 条件で一時的なクエリを使用する代わりに (「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のインストールが手元にありません。

于 2014-07-25T07:50:27.840 に答える