显示来自 Delphi 的数据库结构 (rad studio)

Display database structure from Delphi (rad studio)

这是我的程序。当我执行它时,什么也没有发生;这是为什么?

 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;

正如已经在评论中向您解释的那样,您的 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.TABLEStable.

  7. 中没有strDBName字段

因此您需要返回到 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 数据库。要获取其 table 中的字段(列)列表,我会将此代码添加到 TForm1.FormCreate:

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

如果您希望 FDQuery2 及其网格跟踪 FDQuery1 中选定的 table,您可以使用如下代码在它们之间建立 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 数据库的模式信息,但您应该能够google如何找出您想要从 Paradox 收集的信息。

顺便说一句 #2:在您在删除的答案中引用的 Sql 中,一个问题是对 DBGrid2.SelectedField.ToString 的引用。如果 DBGrid2 从 FDQuery2 获取它的数据,那么您的意思可能是 DBGrid**1**.SelectedField.ToString。如果你仍然有问题,我建议你在一个新的问题中询问它,但要确保你包含了重现问题所需的所有代码。