sql >> Databáze >  >> RDS >> Mysql

Zobrazit strukturu databáze z Delphi (rad studio)

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:

  1. V novém projektu Delphi umístěte do formuláře TFDConnection, TFDQuery, TDataSource, TDataSource a TListBox. Uložte formulář a projekt.

  2. Poklepáním na FDConnection1 otevřete jeho editor připojení a nakonfigurujte jej, abyste jej mohli úspěšně připojit k databázi.

  3. Připojte DBGrid1 k DataSource1 a Datasource1 k FDQuery1.

  4. Přidejte níže uvedený kód do události OnCreate formuláře.

  5. Kompilace a spuštění.

  6. 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.




  1. Rozdíl mezi LIKE a =v MYSQL?

  2. jak pracovat s dynamickými daty a google grafy?

  3. Nepoužívejte sys.sql_dependencies v SQL Server (je zastaralý)

  4. mysql:efektivní způsob pro vyhledávání postfixů (jako '%text' aka. zástupný znak předpony)?