我想在delphi中获取元数据,包括有哪些表,每张表的属性,每张表包括哪些字段,每个字段的类型属性等信息。该用什么数据访问控件?怎么用?多谢了!!

解决方案 »

  1.   

    你用的是什麼數據庫????李維的几本數據書都有講到啊!
    那本
    delphi7 高效數據庫編程
    就有啊
      

  2.   

    没有现成的控件可以用,但这些信息都存在数据库的系统表(一般是视图)里,如果有权限的话可以用SQL语句访问。
    另:使用BDE,ADO数据库控件时,字段信息里也包含但前表或查询语句的字段信息。
      

  3.   

    我现在也遇到跟你一样的问题。用JAVA可以实现。那些都不是用SQL语句来实现的,而是JAVA语句来做。因为我这必须用DELPHI做。我知道用DELPHI自带的一个用ADO连接,数据库与dblist绑定,可以显示所有的表名。(这个数据库是用access)
     但我也要每张表的属性,每张表包括哪些字段,每个字段的类型属性等信息。请大侠指点哦~~
      

  4.   

    我看了李维的书,里面用的是dbExpress,目前只正式支持6种树据库,(InterBase6.5/6.x,DB2 7.2,Oracle9i,MySQL3.23.49,MS SQL Server2000,Infomix SE)。仔细看看有关dbExpress组件的书,应该就没问题了。
      

  5.   

    你用这个对象  ADOX 他是一个ADO的扩展对象 在李维的 Delphi5 高效数据库编程里有介绍
      

  6.   

    请问 welllove88(寒林) ,ADOX怎么用啊?我用ADO实现了对ACCESS的数据表名和属性的获取。
    例子如下:
    获取表名列表:
    ADOConnection1.GetTableNames(ListBox1.Items,False);获取属性名列表:
    ADOConnection1.GetFieldNames('Employee', ListBox1.Items);但是要获得字段名的属性就好像实现不了了!而且我要用代码实现建立access数据库,用ADO好像也实现不了!
     怎么办?能否给我一个使用ADOX的例子?
      

  7.   

    这是我的解决方法:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, ADODB, ADOX_TLB;type
      TForm1 = class(TForm)
        ListBox_Table: TListBox;
        ListBox_Field: TListBox;
        ADOConnection1: TADOConnection;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        GroupBox1: TGroupBox;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        Label9: TLabel;
        Label10: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Edit4: TEdit;
        Edit6: TEdit;
        Button2: TButton;
        Edit5: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure ListBox_TableClick(Sender: TObject);
        procedure ListBox_FieldClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        adoxCatalog : _Catalog;
        adoxTables : Tables;
        adoxTable : _Table;
        adoxColumns : Columns;
        adoxColumn : _Column;
        adoxIndexes : Indexes;
        adoxIndex : _Index;
        adoxKeys : Keys;
        adoxKey : _Key;    function GetADOXFieldType(aType : DataTypeEnum): String;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      AdoConnection1.GetTableNames(ListBox_Table.Items,False);
      //AdoX连接到数据源
      adoxCatalog.Set_ActiveConnection(AdoConnection1.ConnectionObject);
      adoxTables := adoxCatalog.Tables;
    end;procedure TForm1.ListBox_TableClick(Sender: TObject);
    var
      TableName : string;
      iCount : integer;
    begin
      TableName := ListBox_Table.Items[ListBox_Table.itemIndex];
      AdoConnection1.GetFieldNames(TableName,ListBox_Field.Items);  //连接到当前数据表
      for iCount := 0 to adoxTables.Count - 1 do
      begin
        adoxTable := adoxTables.Item[iCount];
        if adoxTable.Name = TableName then
          break;
      end;
    end;function TForm1.GetADOXFieldType(aType : DataTypeEnum): String;
    begin
      case aType of    //
        adEmpty : Result := 'adEmpty';
        adTinyInt : Result := 'adTinyInt';
        adSmallInt : Result := 'adSmallInt';
        adInteger : Result := 'adInteger';
        adBigInt : Result := 'adBigInt';
        adUnsignedTinyInt : Result := 'adUnsignedTinyInt';
        adUnsignedSmallInt : Result := 'adUnsignedSmallInt';
        adUnsignedInt : Result := 'adUnsignedInt';
        adUnsignedBigInt : Result := 'adUnsignedBigInt';
        adSingle : Result := 'adSingle';
        adDouble : Result := 'adDouble';
        adCurrency : Result := 'adCurrency';
        adDecimal : Result := 'adDecimal';
        adNumeric : Result := 'adNumeric';
        adBoolean : Result := 'adBoolean';
        adError : Result := 'adError';
        adUserDefined : Result := 'adUserDefined';
        adVariant : Result := 'adVariant';
        adIDispatch : Result := 'adIDispatch';
        adIUnknown : Result := 'adIUnknown';
        adGUID : Result := 'adGUID';
        adDate : Result := 'adDate';
        adDBDate : Result := 'adDBDate';
        adDBTime : Result := 'adDBTime';
        adDBTimeStamp : Result := 'adDBTimeStamp';
        adBSTR : Result := 'adBSTR';
        adChar : Result := 'adChar';
        adVarChar : Result := 'adVarChar';
        adLongVarChar : Result := 'adLongVarChar';
        adWChar : Result := 'adWChar';
        adVarWChar : Result := 'adVarWChar';
        adLongVarWChar : Result := 'adLongVarWChar';
        adBinary : Result := 'adBinary';
        adVarBinary : Result := 'adVarBinary';
        adLongVarBinary : Result := 'adLongVarBinary';
        adChapter : Result := 'adChapter';
        adFileTime : Result := 'adFileTime';
        adPropVariant : Result := 'adPropVariant';
        adVarNumeric : Result := 'adVarNumeric';
      end;    // case
    end;procedure TForm1.ListBox_FieldClick(Sender: TObject);
    var
      str : string;
      iCount,i : Integer;
      aType : DataTypeEnum;
    begin
      //清空edit1-edit5
      Edit1.Text := '';
      Edit2.Text := '';
      Edit3.Text := '';
      Edit4.Text := '';
      Edit5.Text := '';
      Edit6.Text := '';  //连接到当前所选数据行
      adoxColumns := adoxTable.Columns;
      iCount := ListBox_Field.ItemIndex;
      adoxColumn := adoxColumns.Item[iCount];  //获取字段详细信息
      //1、获取字段名
      Edit1.Text := ListBox_Field.Items[ListBox_Field.ItemIndex];
      //2、获取数据类型
      Edit2.Text := GetADOXFieldType(adoxColumn.Type_);
      //3、获取声明字段大小
      Edit3.Text := IntToStr(adoxColumn.DefinedSize);
      //4、获取主键及外键
      //获取当前表所有的关键字
      adoxKeys := adoxTable.Keys;
      if adoxKeys.Count <> 0 then
      begin
        //遍历所有关键字(key),从中获取主键(PK)及外键(FK)
        for iCount := 0 to adoxKeys.Count - 1 do
        Begin
         adoxKey := adoxKeys.Item[iCount];
         str := adoxKey.Columns.Item[0].Name;    //当前key
          if Edit1.Text = str then
           begin  //判断是主键or外键
            case adoxKey.type_ of
              AdKeyPrimary  :  Edit5.Text := '是';    //主键
              AdKeyForeign  :  Edit6.Text := '是';    //外键
            end;//end case
           end;//end if
        End;//end for
      end;//end if adoxKey.Count <> 0
      if Edit5.Text = '' then Edit5.Text :='否';
      if Edit6.Text = '' then Edit6.Text :='否';end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      adoxCatalog := CoCatalog.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
    //将adoxCatalog清空
      adoxCatalog := nil;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Application.Terminate;
    end;end.
      

  8.   

    你可以参考一下李维先生的<<Delphi5.x ADO/MTS/COM+高级程序设计篇>>和Microsoft ADO Programmer's Guide(即ado程序员参考,网上很多地方都可以下载).
      

  9.   

    ADOX_TLB.dcu 怎么找不到啊?我用的是delphi7 ,请问该怎么处理?这是delphi自带的吗?
      

  10.   

    有一点我忘记说了,使用adox之前要执行下列步骤:
    在Delphi7中选择Project|Import Type Library菜单,然后在Import Type Library对话框中选择Microsoft ADO Ext.对象,此时Class names中会产生三个类别:TTable,TColumn和TIndex,这三个名称和Delohi本身的VCL组件有冲突,重命名之为TADOTable,TADOColumn和TADOIndex.这样就可以使用ADOX对象了.
      

  11.   

    CWoOd1982(CWoOd),太感谢你了!我正好遇到这个问题
      

  12.   

    sql server的有sp_tables 、sp_columns等系统存储过程TADOConnection也有GetTableNames、GetFieldNames等函数
                                   ______________http://hthunter.vicp.net/