从Delphi(rad studio)显示数据库结构

时间:2017-03-31 08:06:59

标签: mysql delphi rad paradox

这是我的程序。当我执行它时没有任何反应;这是为什么?

 FData.FDQuery1.SQL.Clear;
 FData.FDQuery1.SQL.Add('select StrDBName FROM INFORMATION_SCHEMA.TABLES');

 FData.FDQuery1.ExecSQL;

 while FData.FDQuery1.Eof do
    ShowMessage(FData.FDQuery1.Fields[0].ToString);
     end;

1 个答案:

答案 0 :(得分:1)

正如已在评论中向您解释的那样,您的while循环应如下所示:

 while **not** FData.FDQuery1.Eof do **begin**
    ShowMessage(FData.FDQuery1.Fields[0].ToString);
    **FData.FDQuery1.Next;**
 end;

(当然,减去星号)。但是,这不会克服SQL不正确的问题。

所以,试试这个:

  1. 在一个新的Delphi项目中,放置一个TFDConnection,TFDQuery,TDataSource, TDataSource和表单上的TListBox。保存表单和项目。

  2. 双击FDConnection1以弹出其连接编辑器并进行配置 这样你就可以成功地将它连接到你的数据库。

  3. 将DBGrid1连接到DataSource1,将Datasource1连接到FDQuery1。

  4. 将以下代码添加到表单的OnCreate事件中。

  5. 编译并运行。

  6. 您应该立即查看问题的原因。作为错误消息 告诉你,INFORMATION_SCHEMA.TABLES表中没有strDBName字段。

  7. 因此,您需要回溯到MySQL在线帮助,例如,这里

    https://dev.mysql.com/doc/refman/5.7/en/tables-table.html

    然后确切地知道你在寻找什么, 如果您还不知道,以及如何从项目中获取它。

    顺便说一句,如果您不确定自己在做什么,则应该首先在MySql Workbench实用程序中尝试SQL。

    代码

      FDQuery1.SQL.Text := 'SELECT * FROM INFORMATION_SCHEMA.TABLES';
      FDQuery1.Open;
      FDQuery1.GetFieldNames(ListBox1.Items);
    

    我有一个名为'MATestDB'的MySql数据库。要获取其表中的字段(列)列表,我将此代码添加到TForm1.FormCreate:

      FDQuery2.SQL.Text := 'select * from information_schema.columns where table_schema = ''MATestDB''';
      FDQuery2.Open;
    

    如果您希望FDQuery2及其网格跟踪FDQuery1中的选定表,您可以使用以下代码在它们之间建立master-detail关系:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FDQuery1.SQL.Text := 'SELECT * FROM INFORMATION_SCHEMA.TABLES';
    
      FDQuery2.SQL.Text := 'select table_schema, table_name, column_name, data_type, character_maximum_length, ordinal_position from information_schema.columns where table_schema = :Table_Schema and table_name = :Table_Name';
      FDQuery2.IndexFieldNames := 'table_schema;table_name;ordinal_position';
      FDQuery2.MasterFields := 'table_schema;table_name';
      FDQuery2.MasterSource := DataSource1;
    
      FDQuery1.Open;
      FDQuery1.GetFieldNames(ListBox1.Items);
    
      FDQuery2.Open;
      FDQuery2.GetFieldNames(ListBox2.Items);
    
    end;
    

    顺便说一句,您将无法以相同的方式获取Paradox数据库的架构信息,但您应该能够谷歌如何找出您想从Paradox收集哪些信息。

    Btw#2:在您删除的答案中引用的Sql中,一个问题是对DBGrid2.SelectedField.ToString的引用。如果DBGrid2从FDQuery2获取其数据,那么您可能意味着DBGrid**1**.SelectedField.ToString。如果您仍然遇到问题,我建议您在新的q中询问,但请确保包含重现问题所需的所有代码。