【发布时间】:2020-11-27 12:34:34
【问题描述】:
以下代码使用在 Windows 10 机器上运行的社区版 Delphi 和 Interbase 2020 执行 Commit 时会导致以下错误。我做错了什么?
Project FamilyTree.exe 引发异常类 $C0000005,并带有消息“访问冲突在 0x00481a6f:读取地址 0x8b57569f”。
procedure writepreamble;
var
sqltext : string;
basicaction : tbasicaction;
begin
sqltext := 'insert into preambleds(preambleseq,text) values(';
sqltext := sqltext+inttostr(preambleseq)+','+quotedstr(cardimage)+');';
datamodule1.IBSQL1.SQL.text := sqltext;
datamodule1.geddb.DefaultTransaction := datamodule1.IBTransaction1;
datamodule1.IBsql1.Transaction := datamodule1.IBTransaction1;
datamodule1.IBsql1.Transaction.StartTransaction;
datamodule1.ibsql1.ExecuteAction(basicaction) ;
datamodule1.IBsql1.Transaction.Commit;
sqlcount := sqlcount+1;
end;
【问题讨论】:
-
basicaction似乎没有被初始化。这是故意的吗? -
转到项目选项,选中“使用调试 DCU”并“跟踪”提交调用(如果确实发生在崩溃之前而不是之后)以找到创建 AV 的特定行。另外,不要做
sqltext := sqltext+inttostr(preambleseq)之类的事情——这是很容易搞砸数据类型的方法。见bobby-tables.com 见github.com/petdance/bobby-tables/issues/98 -
使用调试器单步调试代码以查看 AV 出现的位置。我的赌注是
datamodule1.ibsql1.ExecuteAction(basicaction);,我的赌注是因为你声明了tbasicaction,但在使用它之前从未初始化它。 -
我不知道如何在 dcu 中设置调试点。它是模块加载断点吗?如果是这样,相关的模块名称是什么?此外,基本操作的枚举类型是什么,插入的相关操作可能是什么?保罗·科尔尼
-
对于项目,在编译器选项中,将“use debug .dcus”设置为true。当然你必须使用调试版本并在调试器下运行(F9)。