【问题标题】:Why does a commit trigger an access violation?为什么提交会触发访问冲突?
【发布时间】: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.comgithub.com/petdance/bobby-tables/issues/98
  • 使用调试器单步调试代码以查看 AV 出现的位置。我的赌注是datamodule1.ibsql1.ExecuteAction(basicaction);,我的赌注是因为你声明了tbasicaction,但在使用它之前从未初始化它。
  • 我不知道如何在 dcu 中设置调试点。它是模块加载断点吗?如果是这样,相关的模块名称是什么?此外,基本操作的枚举类型是什么,插入的相关操作可能是什么?保罗·科尔尼
  • 对于项目,在编译器选项中,将“use debug .dcus”设置为true。当然你必须使用调试版本并在调试器下运行(F9)。

标签: sql delphi interbase


【解决方案1】:

你为什么使用`ExecuteAction`?
使用 `ExecQuery` 执行插入:

IBSQL1.ExecQuery();

最好的问候
莫斯科@

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多