正如在 cmets 中已经向您解释的那样,您的 while 循环应该如下所示:
while **not** FData.FDQuery1.Eof do **begin**
ShowMessage(FData.FDQuery1.Fields[0].ToString);
**FData.FDQuery1.Next;**
end;
(当然,减去星号)。但是,这并不能解决您的 SQL 不正确的问题。
所以,试试这个吧:
在一个新的 Delphi 项目中,放置一个 TFDConnection、TFDQuery、TDataSource、
窗体上的 TDataSource 和 TListBox。保存表单和项目。
双击FDConnection1弹出其连接编辑器并配置
以便您可以成功地将其连接到您的数据库。
将 DBGrid1 连接到 DataSource1,将 Datasource1 连接到 FDQuery1。
将下面的代码添加到表单的 OnCreate 事件中。
编译并运行。
您应该立即看到问题的原因。作为错误信息
告诉你,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 中询问它,但请确保包含重现问题所需的所有代码。