0x00840bd7处的访问冲突:读取地址0x00000000'。过程....(5644)"

时间:2017-04-03 08:35:41

标签: delphi delphi-7 access-violation

在我的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;
你可以帮帮我吗?

1 个答案:

答案 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

我认为您的代码还有其他一些问题:

  1. 使用DBGrid SelectedField访问字段的值。一般来说,这样做是可以的,但是因为在你的情况下你已经知道你需要哪个字段 - Table_Name - 要求用户点击它的重点是什么?此外,用户可能会选择错误的列。

    最好使用FDQuery2.FieldByName('Table_Name').AsString

  2. 我敢打赌你的DBGrid2通过其数据源连接到FDQuery2。如果是这样的话,根据DBGrid2中已经显示的内容进行查询会发出问题,除非您知道自己在做什么。如果您仍在使用其他q中的代码,那么最好从FDQuery1获取Table_Name值。

  3. 在任何情况下,在我对你的其他q Display database structure from Delphi (rad studio)的回答中,我向您展示了如何在两个表之间建立一个主 - 细节链接,以便第二个表(表一列)自动与第一个中的选定表同步。