【问题标题】:Display database structure from Delphi (rad studio)显示来自 Delphi (rad studio) 的数据库结构
【发布时间】:2017-08-25 10:14:35
【问题描述】:

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

 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;

【问题讨论】:

  • 调用Open 而不是ExecSQL 并在while 循环中包含FData.FDQuery1.NextShowMessage 之后。但我投票决定关闭它,因为它缺少 MVCE。 Paradox 和你的 q 有什么关系?
  • while FData.FDQuery1.Eof do 应该是 while not FData.FDQuery1.Eof do
  • 顺便说一句,这已经是过去几天里代码中第三次出现非常相似的错误while ...eof 循环了。你是从某个网站上得到的吗?
  • @MartynA 因为我也想用悖论来应用它
  • 我在字段列表中显示了这个未知的列 StrDBName

标签: mysql delphi rad paradox


【解决方案1】:

正如在 cmets 中已经向您解释的那样,您的 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 字段。

所以你需要回溯到 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 数据库的架构信息,但您应该能够通过 google 找到您想从 Paradox 收集哪些信息。

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

【讨论】:

  • 非常感谢您给我的代码完美运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多