加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi – 为什么我会收到此访问冲突? ADOQuery参数是否有限制

发布时间:2020-12-15 09:35:07 所属栏目:大数据 来源:网络整理
导读:我有这个代码返回访问冲突(‘模块’sqloledb.dll’中地址74417E44的访问冲突’.读取地址786E3552′)我无法确定问题出在哪里.我唯一的猜测是ADOQuery对我们可以传递的参数数量有限制. 代码如下: With qryInsert do begin Active := False; Close; Sql.Clear;
我有这个代码返回访问冲突(‘模块’sqloledb.dll’中地址74417E44的访问冲突’.读取地址786E3552′)我无法确定问题出在哪里.我唯一的猜测是ADOQuery对我们可以传递的参数数量有限制.
代码如下:

With qryInsert do
  begin
    Active := False;
    Close;
    Sql.Clear;
    Sql.Add('Insert Into MyTable(ColumnOne,');
    Sql.Add('             ColumnTwo,');
    Sql.Add('             ColumnThree,');
    Sql.Add('             ColumnFour,');
    Sql.Add('             ColumnFive,');
    Sql.Add('             ColumnSix,');
    Sql.Add('             ColumnSeven,');
    Sql.Add('             ColumnEight,');
    Sql.Add('             ColumnNine,');
    Sql.Add('             ColumnTen,');
    Sql.Add('             ColumnEleven,');
    Sql.Add('             ColumnTwelve,');
    if qrySelect.FieldByName('ColumnTwelve').AsSTring = 'Y' then
    begin
      Sql.Add('           ColumnThirteen,');
      Sql.Add('           ColumnFourteen,');
      Sql.Add('           ColumnFifteen,');
    end;
    Sql.Add('             ColumnSixteen,');
    if qrySelect.FieldByName('ColumnSixteen').AsSTring = 'Y' then
    begin
      Sql.Add('           ColumnSeventeen,');
      Sql.Add('           ColumnEighteen,');
      Sql.Add('           ColumnNineteen,');
    end;
    if qrySelect.FieldByName('ColumnTwenty').AsSTring = 'Y' then
    begin
      Sql.Add('           ColumnTwenty,');
      Sql.Add('           ColumnTwentyOne,');
      Sql.Add('           ColumnTwentyTwo,');
      Sql.Add('           ColumnTwentyThree,');
    end
    else
      Sql.Add('           ColumnTwenty,');
    Sql.Add('             ColumnTwentyFour) ');
    Sql.Add('Values(:ColumnOne,:ColumnTwo,:ColumnThree,:ColumnFour,');
    Sql.Add('       :ColumnFive,' + dateDB + ',:ColumnSeven,');
    Sql.Add('       :ColumnEight,:ColumnNine,:ColumnTen,');
    Sql.Add('       :ColumnEleven,');
    Sql.Add('       :ColumnTwelve,');
    if qrySelect.FieldByName('ColumnTwelve').AsSTring = 'Y' then
      Sql.Add('     :ColumnThirteen,:ColumnFourteen,:ColumnFifteen,');
    Sql.Add('       :ColumnSixteen,');
    if qrySelect.FieldByName('ColumnSixteen').AsSTring = 'Y' then
      Sql.Add('     :ColumnSeventeen,:ColumnEighteen,:ColumnNineteen,');
    if qrySelect.FieldByName('ColumnTwenty').AsSTring = 'S' then
    begin
      Sql.Add('   :ColumnTwenty,');
      Sql.Add('   :ColumnTwentyOne,:ColumnTwentyTwo,:ColumnTwentyThree,');
    end
    else
      Sql.Add('   :ColumnTwenty,');
    Sql.Add('     :ColumnTwentyFour)                                  ');
    {And then for all the parameteres,pass the value}
    Parameters.ParamByName('ColumnOne').Value := varColumnOne;
    ...
    Parameters.ParamByName('ColumnTwentyFour').Value := varColumnTwentyFour;
    ExecSQL;
  end;

我在这一行得到错误:

Sql.Add('       :ColumnTwelve,');

这是我的insert语句中的第11个参数.
如果我评论这一行,我会在下一个参数中得到错误.
如果我像这样直接输入值:

Sql.Add('     ' + varColumnTwelve + ',');

它工作正常,但我在下一个参数中得到错误.

所以它让我想知道:ADOQuery是否限制了它可以处理的参数数量?或者,如果这不是真正的问题,有没有人知道如何解决这个问题?

笔记:

>我正在使用Delphi 7和Windows 8.1.
>调试时只显示AV(并且始终显示),如果我通过“.exe”直接执行应用程序,它永远不会出现.
>如果在错误出现后我一直按“运行”,它会显示越来越多的AV(我认为AV的数量与第10次之后添加的参数的数量相同),直到应用程序继续正常运行.
>插入在屏幕上出现所有AV后工作.我只是想明白为什么一切看起来都很好我会收到这个错误.

解决方法

The AV only (and always) appears when debugging,it does never appear if I execute the application directly through its “.exe”.

….

The insert works after all the AVs appeared on the screen. I just want to understand why am I getting this error when everything looks fine.

访问冲突是在外部模块中引发的,使用Delphi以外的语言实现.很可能外部代码的行为正确且符合设计,并且预计会发生访问冲突.

这可能听起来很奇怪,但外部代码清楚地处理异常,因为控件没有传递给代码的异常处理程序.如您所见,该程序正常工作.

这就是所谓的first chance exception.调试器会得到通知并中断.但是然后控制返回到程序,在这种情况下,程序处理异常并继续.对于代码来说,引发第一次机会访问冲突异常,但仍能正常运行,这是完全正常的,尽管可能是反直觉的.作为该声明的证据,请参阅VS开发团队成员撰写的article:

Why the VS Debugger does not stop on first chance Access Violations (by default)?

….

The reason the default for first-chance AVs does not stop is that
sometimes Windows calls will AV,and then catch the exception
themselves and carry on happily. If we did default to stopping on
first chance AVs we would stop users in some strange place in say
kernel32.dll and many would be very confused.

所以在正确性方面,我认为没有什么可担心的.但它确实使调试变得困难.试试@Deltics提出的各种建议.如果通过进行这些更改,您可以避免异常,那就是好事.否则,您可能需要(至少暂时)禁止调试器中断异常.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读