Như đã giải thích cho bạn trong phần nhận xét, while
của bạn vòng lặp sẽ trông giống như sau:
while **not** FData.FDQuery1.Eof do **begin**
ShowMessage(FData.FDQuery1.Fields[0].ToString);
**FData.FDQuery1.Next;**
end;
(tất nhiên là trừ các dấu hoa thị). Tuy nhiên, điều đó sẽ không khắc phục được sự cố SQL của bạn không chính xác.
Vì vậy, hãy thử điều này thay thế:
-
Trong một dự án Delphi mới, hãy đặt một TFDConnection, TFDQuery, TDataSource, TDataSource và một TListBox trên một biểu mẫu. Lưu biểu mẫu và dự án.
-
Nhấp đúp vào FDConnection1 để bật lên trình chỉnh sửa kết nối và cấu hình nó để bạn có thể kết nối thành công với cơ sở dữ liệu của mình.
-
Kết nối DBGrid1 với DataSource1 và Datasource1 với FDQuery1.
-
Thêm mã bên dưới vào sự kiện OnCreate của biểu mẫu.
-
Biên dịch và chạy.
-
Bạn nên ngay lập tức xem nguyên nhân của vấn đề của bạn. Do lỗi đã thông báo cho bạn, không có trường strDBName trong bảng INFORMATION_SCHEMA.TABLES.
Vì vậy, bạn cần quay lại trợ giúp trực tuyến MySQL, bắt đầu, ví dụ:đây
https://dev.mysql.com/doc/refman /5.7/en/tables-table.html
và tìm ra chính xác những gì bạn đang tìm kiếm, nếu bạn chưa biết và làm thế nào để có được nó từ bên trong dự án của bạn.
Btw, nếu bạn không chắc mình đang làm gì, bạn nên thử SQL trước trong tiện ích MySql Workbench.
Mã
FDQuery1.SQL.Text := 'SELECT * FROM INFORMATION_SCHEMA.TABLES';
FDQuery1.Open;
FDQuery1.GetFieldNames(ListBox1.Items);
Tôi có một cơ sở dữ liệu MySql được gọi là 'MATestDB'. Để có được danh sách các trường (cột) trong bảng của nó, tôi sẽ thêm mã này vào TForm1.FormCreate:
FDQuery2.SQL.Text := 'select * from information_schema.columns where table_schema = ''MATestDB''';
FDQuery2.Open;
Nếu bạn muốn FDQuery2 và lưới của nó theo dõi bảng đã chọn trong FDQuery1, bạn có thể sử dụng mã như sau để thiết lập master-detail
mối quan hệ giữa chúng:
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, bạn sẽ không thể lấy thông tin lược đồ cho cơ sở dữ liệu Paradox theo cách tương tự, nhưng bạn có thể lên google cách tìm thông tin bạn muốn thu thập từ Paradox.
Btw # 2:Trong Sql bạn đã trích dẫn trong câu trả lời đã xóa của mình, một vấn đề sẽ là tham chiếu đến DBGrid2.SelectedField.ToString
. Nếu DBGrid2 lấy dữ liệu của nó từ FDQuery2, thì bạn có thể hiểu là DBGrid**1**.SelectedField.ToString
. Nếu bạn vẫn gặp sự cố với vấn đề đó, tôi khuyên bạn nên hỏi về vấn đề đó trong một q mới, nhưng hãy đảm bảo bạn bao gồm tất cả mã cần thiết để tái tạo sự cố.