Delphi – 为什么我会收到此访问冲突? ADOQuery参数是否有限制
我有这个代码返回访问冲突(‘模块’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. 解决方法
访问冲突是在外部模块中引发的,使用Delphi以外的语言实现.很可能外部代码的行为正确且符合设计,并且预计会发生访问冲突. 这可能听起来很奇怪,但外部代码清楚地处理异常,因为控件没有传递给代码的异常处理程序.如您所见,该程序正常工作. 这就是所谓的first chance exception.调试器会得到通知并中断.但是然后控制返回到程序,在这种情况下,程序处理异常并继续.对于代码来说,引发第一次机会访问冲突异常,但仍能正常运行,这是完全正常的,尽管可能是反直觉的.作为该声明的证据,请参阅VS开发团队成员撰写的article:
所以在正确性方面,我认为没有什么可担心的.但它确实使调试变得困难.试试@Deltics提出的各种建议.如果通过进行这些更改,您可以避免异常,那就是好事.否则,您可能需要(至少暂时)禁止调试器中断异常. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |