Mysql
 sql >> Base de données >  >> RDS >> Mysql

Afficher la structure de la base de données de Delphi (rad studio)

Comme déjà expliqué dans les commentaires, votre while la boucle devrait ressembler à ceci :

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

(moins les astérisques, bien sûr). Cependant, cela ne résoudrait pas le problème que votre SQL est incorrect.

Alors, essayez ceci à la place :

  1. Dans un nouveau projet Delphi, placez un TFDConnection, un TFDQuery, un TDataSource, un TDataSource et un TListBox sur un formulaire. Enregistrez le formulaire et le projet.

  2. Double-cliquez sur FDConnection1 pour faire apparaître son éditeur de connexion et le configurer afin de pouvoir le connecter avec succès à votre base de données.

  3. Connectez DBGrid1 à DataSource1 et Datasource1 à FDQuery1.

  4. Ajoutez le code ci-dessous à l'événement OnCreate du formulaire.

  5. Compilez et exécutez.

  6. Vous devriez voir immédiatement la cause de votre problème. Comme le message d'erreur vous l'a indiqué, il n'y a pas de champ strDBName dans la table INFORMATION_SCHEMA.TABLES.

Vous devez donc revenir à l'aide en ligne de MySQL, en commençant par ex. ici

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

et déterminez exactement ce que vous recherchez, si vous ne le savez pas déjà, et comment l'obtenir à partir de votre projet.

Au fait, si vous n'êtes pas sûr de ce que vous faites, vous devez toujours essayer d'abord votre SQL dans l'utilitaire MySql Workbench.

Code

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

J'ai une base de données MySql appelée 'MATestDB'. Pour obtenir une liste des champs (colonnes) dans ses tables, j'ajouterais ce code à TForm1.FormCreate :

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

Si vous souhaitez que FDQuery2 et sa grille suivent la table sélectionnée dans FDQuery1, vous pouvez utiliser un code comme celui-ci pour configurer un master-detail relation entre eux :

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;

Au fait, vous ne pourrez pas obtenir les informations de schéma d'une base de données Paradox de la même manière, mais vous devriez pouvoir rechercher sur Google comment trouver les informations que vous souhaitez collecter à partir de Paradox.

Btw #2 :Dans le Sql que vous avez cité dans votre réponse supprimée, un problème serait la référence à DBGrid2.SelectedField.ToString . Si DBGrid2 obtient ses données de FDQuery2, alors vous avez peut-être voulu dire DBGrid**1**.SelectedField.ToString . Si vous rencontrez toujours un problème avec cela, je vous suggère de le demander dans un nouveau q, mais assurez-vous d'inclure tout le code nécessaire pour reproduire le problème.