【发布时间】:2015-05-18 14:14:23
【问题描述】:
我有这段代码返回访问冲突(“模块“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, ');
这是我插入语句中的第 11 个参数。 如果我评论这一行,我会在下一个参数中得到错误。 如果我像这样直接输入值:
Sql.Add(' ' + varColumnTwelve + ', ');
它工作正常,但我在下一个参数中得到错误。
所以这让我想知道:ADOQuery 是否有它可以处理的参数数量的限制?或者,如果这不是真正的问题,有没有人知道我该如何解决这个问题?
注意事项:
我使用的是 Delphi 7 和 Windows 8.1。
AV 仅(并且总是)在调试时出现,如果我直接通过其“.exe”执行应用程序,它永远不会出现。
如果我在出现错误后一直按“运行”,它会显示越来越多的 AV(我认为 AV 的数量与 10 号之后添加的参数数量相同),直到应用程序继续正常运行。
在所有 AV 出现在屏幕上之后插入工作。我只是想了解为什么在一切正常的情况下会出现此错误。
【问题讨论】:
-
你在使用线程吗?
-
@whosrdaddy 不,不使用线程。
-
仅供参考,ADO 上有 1024 个参数的硬限制,所以这显然不是问题所在。大卫走在正确的轨道上,问题出在你代码的其他地方,听听他的建议......
-
首先要尝试将查询构建包装在
qry.SQL.BeginUpdate;...qry.SQL.EndUpdate对中。我(曾经,使用 Informix 驱动程序 IIRC)看到过类似的问题。如果没有 BeginUpdate..EndUpdate,TADOQuery 将尝试解析每个 Add() 的参数 -
@Gerry - Begin/EndUpdate 不参与因 SQL 更改而导致的参数解析。这是使用 ParamCheck 实现的。
标签: delphi access-violation tadoquery