Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Anzeige der Datenbankstruktur von Delphi (rad studio)

Wie Ihnen bereits in Kommentaren erklärt wurde, Ihr while Schleife sollte in etwa so aussehen:

 while **not** FData.FDQuery1.Eof do **begin**
    ShowMessage(FData.FDQuery1.Fields[0].ToString);
    **FData.FDQuery1.Next;**
 end;

(ohne die Sternchen natürlich). Das Problem, dass Ihr SQL nicht korrekt ist, würde dadurch jedoch nicht gelöst.

Versuchen Sie stattdessen Folgendes:

  1. Platzieren Sie in einem neuen Delphi-Projekt eine TFDConnection, TFDQuery, TDataSource, TDataSource und eine TListBox auf einem Formular. Speichern Sie das Formular und das Projekt.

  2. Doppelklicken Sie auf FDConnection1, um den Verbindungseditor zu öffnen, und konfigurieren Sie ihn so, dass Sie ihn erfolgreich mit Ihrer Datenbank verbinden können.

  3. Verbinden Sie DBGrid1 mit DataSource1 und Datasource1 mit FDQuery1.

  4. Fügen Sie den folgenden Code zum OnCreate-Ereignis des Formulars hinzu.

  5. Kompilieren und ausführen.

  6. Sie sollten sofort die Ursache Ihres Problems sehen. Wie die Fehlermeldung Ihnen sagt, gibt es kein strDBName-Feld in der Tabelle INFORMATION_SCHEMA.TABLES.

Sie müssen also zurück zur MySQL-Online-Hilfe gehen und z. hier

https://dev.mysql.com/doc/refman /5.7/en/tables-table.html

und arbeiten Sie genau aus, wonach Sie suchen, falls Sie es noch nicht wissen, und wie Sie es aus Ihrem Projekt herausholen können.

Übrigens, wenn Sie sich nicht sicher sind, was Sie tun, sollten Sie Ihr SQL immer zuerst im Dienstprogramm MySql Workbench ausprobieren.

Code

  FDQuery1.SQL.Text := 'SELECT * FROM INFORMATION_SCHEMA.TABLES';
  FDQuery1.Open;
  FDQuery1.GetFieldNames(ListBox1.Items);

Ich habe eine MySql-Datenbank namens 'MATestDB'. Um eine Liste der Felder (Spalten) in seinen Tabellen zu erhalten, würde ich diesen Code zu TForm1.FormCreate hinzufügen:

  FDQuery2.SQL.Text := 'select * from information_schema.columns where table_schema = ''MATestDB''';
  FDQuery2.Open;

Wenn Sie möchten, dass FDQuery2 und sein Raster die ausgewählte Tabelle in FDQuery1 verfolgen, können Sie Code wie den folgenden verwenden, um ein master-detail einzurichten Beziehung zwischen ihnen:

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;

Übrigens werden Sie nicht in der Lage sein, Schemainformationen für eine Paradox-Datenbank auf die gleiche Weise zu erhalten, aber Sie sollten in der Lage sein, zu googeln, wie Sie herausfinden können, welche Informationen Sie von Paradox sammeln möchten.

Übrigens #2:In der SQL, die Sie in Ihrer gelöschten Antwort zitiert haben, wäre ein Problem der Verweis auf DBGrid2.SelectedField.ToString . Wenn DBGrid2 seine Daten von FDQuery2 bekommt, dann haben Sie vielleicht DBGrid**1**.SelectedField.ToString gemeint . Wenn Sie immer noch Probleme damit haben, schlage ich vor, dass Sie in einem neuen q danach fragen, aber stellen Sie sicher, dass Sie den gesamten Code angeben, der zum Reproduzieren des Problems erforderlich ist.