显示来自 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 不正确的问题。
所以,试试这个:
在新的 Delphi 项目中,放置一个 TFDConnection、TFDQuery、TDataSource、
窗体上的 TDataSource 和 TListBox。保存表格和项目。
双击FDConnection1弹出其连接编辑器并配置
这样您就可以成功地将它连接到您的数据库。
将 DBGrid1 连接到 DataSource1,将 Datasource1 连接到 FDQuery1。
将下面的代码添加到窗体的 OnCreate 事件中。
编译并运行.
您应该立即找出问题的原因。作为错误信息
告诉你,INFORMATION_SCHEMA.TABLEStable.
中没有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
。如果你仍然有问题,我建议你在一个新的问题中询问它,但要确保你包含了重现问题所需的所有代码。
这是我的程序。当我执行它时,什么也没有发生;这是为什么?
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 不正确的问题。
所以,试试这个:
在新的 Delphi 项目中,放置一个 TFDConnection、TFDQuery、TDataSource、 窗体上的 TDataSource 和 TListBox。保存表格和项目。
双击FDConnection1弹出其连接编辑器并配置 这样您就可以成功地将它连接到您的数据库。
将 DBGrid1 连接到 DataSource1,将 Datasource1 连接到 FDQuery1。
将下面的代码添加到窗体的 OnCreate 事件中。
编译并运行.
您应该立即找出问题的原因。作为错误信息 告诉你,INFORMATION_SCHEMA.TABLEStable.
中没有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
。如果你仍然有问题,我建议你在一个新的问题中询问它,但要确保你包含了重现问题所需的所有代码。