sql >> Databasteknik >  >> RDS >> Mysql

Visa databasstruktur från Delphi (rad studio)

Som redan förklarats för dig i kommentarer, din while loop bör se ut ungefär så här:

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

(minus asteriskerna förstås). Det skulle dock inte lösa problemet med att din SQL är felaktig.

Så prova det här istället:

  1. I ett nytt Delphi-projekt placerar du en TFDConnection, TFDQuery, TDataSource, TDataSource och en TListBox på ett formulär. Spara formuläret och projektet.

  2. Dubbelklicka på FDConnection1 för att öppna dess anslutningsredigerare och konfigurera den så att du framgångsrikt kan ansluta den till din databas.

  3. Anslut DBGrid1 till DataSource1 och DataSource1 till FDQuery1.

  4. Lägg till koden nedan i formulärets OnCreate-händelse.

  5. Kompilera och kör.

  6. Du bör omedelbart se orsaken till ditt problem. Som felmeddelandet sa, finns det inget strDBName-fält i tabellen INFORMATION_SCHEMA.TABLES.

Så du behöver gå tillbaka till MySQL onlinehjälpen, med start t.ex. här

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

och räkna ut exakt vad det är du letar efter, om du inte redan vet, och hur du får det inifrån ditt projekt.

Btw, om du inte är säker på vad du gör bör du alltid prova din SQL först i verktyget MySql Workbench.

Kod

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

Jag har en MySql-databas som heter 'MATestDB'. För att få en lista över fälten (kolumnerna) i dess tabeller skulle jag lägga till den här koden till TForm1.FormCreate:

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

Om du vill att FDQuery2 och dess rutnät ska spåra den valda tabellen i FDQuery1, kan du använda kod som följande för att ställa in en master-detail förhållandet mellan dem:

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, du kommer inte att kunna få schemainformation för en Paradox-databas på samma sätt, men du borde kunna googla hur du tar reda på vilken information du vill samla in från Paradox.

Btw #2:I SQL-filen du citerade i ditt raderade svar skulle ett problem vara referensen till DBGrid2.SelectedField.ToString . Om DBGrid2 får sina data från FDQuery2, så kan du ha menat DBGrid**1**.SelectedField.ToString . Om du fortfarande har problem med det, föreslår jag att du frågar om det i en ny q, men se till att du inkluderar all kod som behövs för att återskapa problemet.




  1. Kan inte skicka parameter 2 genom referens - uuid PDO

  2. Hur jämför man data mellan två databaser i PostgreSQL?

  3. Tar rekordet med maxdatum

  4. VÄLJ data från ett annat schema i Oracle