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
c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?