アクセス違反 (「モジュール '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 がどんどん表示されます (AV の数は、10 番目以降に追加されたパラメーターの数と同じだと思います)。
挿入は、すべての AV が画面に表示された後に機能します。すべてが正常に見えるのに、なぜこのエラーが発生するのかを理解したいだけです。