在我的bd网格中选择表的名称之后,我希望通过双击获得属于该表的colones但我发现此错误
lorque j双击例外'第一次机会'到$ 00840BD7异常类$ C0000005,在0x00840bd7处有一条消息'访问冲突:读取地址0x00000000'。进程conversion.exe(5644)" 这是代码:
procedure TForm5.DBGrid1DblClick(Sender: TObject);
begin
FDQuery2.SQL.Clear;
FDQuery2.SQL.Text := 'select column_name from information_schema.columns where table_schema="bases" and table_name = "'+DBGrid2.SelectedField.ToString+'"';
FDQuery2.Open;
ListBox2.Clear;
FDQuery2.GetFieldNames(ListBox2.Items);
end;
你可以帮帮我吗?
答案 0 :(得分:3)
如果您重写代码如下:
var
AField : TField;
begin
AField := DBGrid2.SelectedField;
Caption := AField.ToString;
FDQuery2.Close;
FDQuery2.SQL.Text := 'select column_name from information_schema.columns where table_schema="bases" and table_name = "'+DBGrid2.SelectedField.ToString+'"';
FDQuery2.Open;
ListBox2.Clear;
FDQuery2.GetFieldNames(ListBox2.Items);
并运行它,你应该能够立即看到你的问题。
ToString
NOT 会返回网格所选字段中的值 - 在您的情况下,它会返回TStringField
,即类型领域的。不是它的字符串值。要从表中获取其字符串值,请使用DBGRid2.SelectedField.AsString
。
我认为您的代码还有其他一些问题:
使用DBGrid SelectedField
访问字段的值。一般来说,这样做是可以的,但是因为在你的情况下你已经知道你需要哪个字段 - Table_Name
- 要求用户点击它的重点是什么?此外,用户可能会选择错误的列。
最好使用FDQuery2.FieldByName('Table_Name').AsString
我敢打赌你的DBGrid2通过其数据源连接到FDQuery2。如果是这样的话,根据DBGrid2中已经显示的内容进行查询会发出问题,除非您知道自己在做什么。如果您仍在使用其他q中的代码,那么最好从FDQuery1获取Table_Name值。
在任何情况下,在我对你的其他q Display database structure from Delphi (rad studio)的回答中,我向您展示了如何在两个表之间建立一个主 - 细节链接,以便第二个表(表一列)自动与第一个中的选定表同步。