2014-01-09 4 views
4

저는 SQLite 및 FireDAC을 함께 사용하도록 교육하고 있습니다. SQLite 파일에서 하나의 테이블을 표시하는 아주 간단한 응용 프로그램을 작성한 후에 나는 배우기에 도움이되는 간단한 뷰어 '프레임'을 만들 것이라고 결심했습니다. 엔지니어링 사용을 위해 내 응용 프로그램에 넣을 디버깅 도구를 (결국) 제공하십시오.FireDAC TFDConnection을 사용하여 테이블, 필드 및 필드 정의를 반복하는 방법

그래서 간단한 TTreeView를 사용했으며 '데이터베이스'(카탈로그), '테이블', '필드 이름'및 '필드 유형'의 계층 구조로 채우고 싶습니다. 지금까지 (TFDConnection.Getxxxxx를 사용하여) 카탈로그, 테이블 및 필드를 나열하는 것이 현저하게 쉬웠지만 필드 정의를 얻는 방법을 더 깊이 알 수는 없습니다. 이것은 TFDC 연결에서 할 수 있습니까? 아니면 임시 쿼리를 열어야합니까? 브라이언, '// 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을 인스턴스화하고 AConnection에 연결 한 다음 FieldDefs.Update를 호출하면 해결할 수 있습니다. 이렇게하면 데이터를 가져 오지 않습니다.

+0

제안 주셔서 감사하지만 Table.FunctionDefs.Update를 Table.Active : = True로 바꾸면 작동합니다. 나는 Table.Connection = xxx와 Table만을하고있다.TableName : = ATableName 그래도 초기화해야하는 다른 필드가 있습니까? –

0

데이터가없는 테이블 스키마를 가져 오기 위해 거짓 조건이있는 임시 쿼리를 사용하는 대신 (예 : "select * from tablename where 1 = 0"- 사용자가 의도 한 것으로 가정 함) 데이터베이스에 따라 테이블 정보를 얻기 위해 쿼리를 사용할 수도 있습니다. 처럼;

MS SQL Server의
PRAGMA table_info(tablename) 

: MySQL을 들어

: SQLite는 대한

show columns from tablename; 

내가 PostgreSQL을 또한 이러한 기능을 가지고 있다고 생각

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

그러나 나는이 해달라고 이 시점에서 pgsql 설치가 편리합니다.

1

TFDMetaInfoQuery 구성 요소를 사용하십시오. 메타 데이터 정보를 얻기 위해 통합되어 있으므로 모든 종류의 지원되는 DBMS에서 사용할 수 있습니다. 요청 된 MetaInfoKind 및 주어진 DBMS 오브젝트 설명으로 metadata resultsets을 채 웁니다.