Jak již bylo vysvětleno v komentářích, vaše while
smyčka by měla vypadat nějak takto:
while **not** FData.FDQuery1.Eof do **begin**
ShowMessage(FData.FDQuery1.Fields[0].ToString);
**FData.FDQuery1.Next;**
end;
(samozřejmě bez hvězdiček). To by však nevyřešilo problém, že vaše SQL je nesprávné.
Zkuste místo toho toto:
-
V novém projektu Delphi umístěte do formuláře TFDConnection, TFDQuery, TDataSource, TDataSource a TListBox. Uložte formulář a projekt.
-
Poklepáním na FDConnection1 otevřete jeho editor připojení a nakonfigurujte jej, abyste jej mohli úspěšně připojit k databázi.
-
Připojte DBGrid1 k DataSource1 a Datasource1 k FDQuery1.
-
Přidejte níže uvedený kód do události OnCreate formuláře.
-
Kompilace a spuštění.
-
Měli byste okamžitě vidět příčinu vašeho problému. Jak vám sdělila chybová zpráva, v tabulce INFORMATION_SCHEMA.TABLES není žádné pole strDBName.
Musíte se tedy vrátit k online nápovědě MySQL a začít např. zde
https://dev.mysql.com/doc/refman /5.7/cs/tables-table.html
a zjistěte, co přesně hledáte, pokud to ještě nevíte, a jak to z vašeho projektu získat.
Btw, pokud si nejste jisti, co děláte, měli byste vždy nejprve vyzkoušet své SQL v nástroji MySql Workbench.
Kód
FDQuery1.SQL.Text := 'SELECT * FROM INFORMATION_SCHEMA.TABLES';
FDQuery1.Open;
FDQuery1.GetFieldNames(ListBox1.Items);
Mám databázi MySql s názvem 'MATestDB'. Chcete-li získat seznam polí (sloupců) v jeho tabulkách, přidal bych tento kód do TForm1.FormCreate:
FDQuery2.SQL.Text := 'select * from information_schema.columns where table_schema = ''MATestDB''';
FDQuery2.Open;
Pokud chcete, aby FDQuery2 a jeho mřížka sledovaly vybranou tabulku ve FDQuery1, můžete použít kód jako následující k nastavení master-detail
vztah mezi nimi:
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;
Btw, nebudete moci získat informace o schématu pro databázi Paradox stejným způsobem, ale měli byste být schopni vygooglovat, jak zjistit, jaké informace chcete z Paradoxu získat.
Btw #2:V Sql, který jste citovali ve vaší smazané odpovědi, by jeden problém byl odkaz na DBGrid2.SelectedField.ToString
. Pokud DBGrid2 získává data z FDQuery2, pak jste možná mysleli DBGrid**1**.SelectedField.ToString
. Pokud s tím stále máte problém, doporučuji, abyste se na to zeptali v novém q, ale ujistěte se, že jste zahrnuli veškerý kód nezbytný k reprodukci problému.