0x00840bd7 处的访问冲突:读取地址 0x00000000'。过程......(5644)“ [关闭]

Posted

技术标签:

【中文标题】0x00840bd7 处的访问冲突:读取地址 0x00000000\'。过程......(5644)“ [关闭]【英文标题】:access violation at 0x00840bd7: read of address 0x00000000'. Process.... (5644) " [closed]0x00840bd7 处的访问冲突:读取地址 0x00000000'。过程......(5644)“ [关闭] 【发布时间】:2017-04-03 08:35:40 【问题描述】:

在我的 bd 网格中选择表的名称后,我想通过双击获得属于该表的冒号,但我发现此错误

lorque j 双击异常“第一次机会”到 $ 00840BD7 异常类 $ C0000005 并显示消息“0x00840bd7 的访问冲突:读取地址 0x00000000”。进程转换.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;

你能帮帮我吗?

【问题讨论】:

也许您应该指定您在哪一行获得访问冲突。您是否尝试过调试器并查看导致它的对象引用? 错误信息已经够清楚了。您在某处有一个 nil 指针或引用。你为什么不自己调试呢?为什么在进行基本调试之前问这里?还是您的问题实际上是关于错误消息的含义? 你有什么问题? @DavidHeffernan:实际上,OP 的问题很简单,基于一个误解。 @DavidHeffernan:我完全同意。这就是为什么我尝试 - 并不总是完美 - 在我的答案中包含调试问题的方法。像这样的 q 似乎很明显,OP 不知道从哪里开始。 【参考方案1】:

如果你像这样重写你的代码:

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,这是该字段的 type。不是它的字符串值。要从表中获取其字符串值,请使用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) 的回答中,我向您展示了如何在两个表之间设置主从链接,以便第二个表(表列一)自动与第一个中的选定表。

【讨论】:

感谢您的回复

以上是关于0x00840bd7 处的访问冲突:读取地址 0x00000000'。过程......(5644)“ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

0x5919c8ec (msvcr100d.dll) 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xfeeefeee

选择PixelFormat 访问冲突读取位置

**** 访问冲突读取位置处未处理的异常 *******

c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?

访问冲突读取位置0x00000002 [关闭]

0xC0000005: 读取位置 0x00000000 时发生访问冲突