Консультация № 67530
18.12.2006, 14:46
0.00 руб.
0 15 1
Уважаемые эксперты по Дельфи!
Может кто сталкивался с ситуацией: при выполнении программы в строке помеченной звездочкой(*) происходит ошибка.
Project XXX raised exception class EAccessViolation with message ‘Access violation at adress 77C4809E in module ‘msvcrt.dll‘. Write of ardess YYY‘

Если же стоку *ADOSQL.SQL.Append(‘where X.b=:inPR‘) заменить на *ADOSQL.SQL.Append(‘where X.b=1‘) - все работает без проблем.

Delphi2006, MSSQL2000+SP3, msvcrt.dll(7.0.2600.2180), msado15.dll(2.81.1117.0)


Приложение:
procedure TForm6.Button1Click(Sender: TObject);var ADOSQL:TADOQuery;begin ADOSQL:=TADOQuery.Create(nil); try ADOSQL.Connection:=ADOConnection1; ADOSQL.SQL.Clear; ADOSQL.Parameters.Clear; ADOSQL.SQL.Append(‘select X.a, (select Y.a from Y where Y.c=X.c) from X‘); *ADOSQL.SQL.Append(‘where X.b=:inPR‘); ADOSQL.Parameters.ParamByName(‘inPR‘).Value:=1; ADOSQL.Open; finally ADOSQL.Destroy; end;end;

Обсуждение

давно
Мастер-Эксперт
425
4118
18.12.2006, 19:18
общий
это ответ
Здравствуйте, Staram!
Закомментируйте вот эту строчку:
ADOSQL.Parameters.Clear;
Должно заработать.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
19.12.2006, 09:57
общий
Здравствуйте, Sir Henry!Вы немного не внимательны: ADOSQL.Parameters.Clear практически никакой смысловой нагрузки не несет. В даннном примере ей и очищать нечего, компонент только создан!Ошибка происходит в момент Append (или Add).
Неизвестный
19.12.2006, 10:34
общий
PS: При использовании Oracle всё работает.
давно
Мастер-Эксперт
425
4118
23.12.2006, 21:32
общий
Да уж, действительно, невнимателен. :)В таком случае у Вас все равно та же проблема, только с другого бока.В строке:<i>ADOSQL.Parameters.ParamByName(‘inPR‘).Value</i> возможно происходит обращение к параметру которого нет в списке.Попробуйте принудительно создать параметр с этим именем и посмотреть, что будет.ADOSQL.Parameters.CreateParameter(‘inPR‘, ftInteger, pdInput, 4, 1);
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
26.12.2006, 12:52
общий
:)*ADOSQL.SQL.Append(‘where X.b=:inPR‘);Ошибка происходит тут. Не ближе, и не дальше.Из самой среды дельфи можно выкрутиться - не использовать параметры, а просто добавлять значение. Но, данные запросы вываливают точно такую же ошибку , например в FastReport - а там уже проблематично проделать все ручками.
давно
Мастер-Эксперт
425
4118
26.12.2006, 17:04
общий
Т.е. создавать параметр вручную Вы категорически отказываетесь?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
26.12.2006, 17:24
общий
Ну зачем так категорично? Нет, не отказываюсь - даже пробовал.Но результат все тот же, точнее нет результата.
Неизвестный
26.12.2006, 17:33
общий
PS: Ошибка происходит раньше чем идет выполнение команды ADOSQL.Parameters.ParamByName(‘inPR‘).Value:=1;Т.е. до инициализации парамтре значением дело не доходит.Ошибка в строке *ADOSQL.SQL.Append(‘where X.b=:inPR‘);
давно
Мастер-Эксперт
425
4118
26.12.2006, 20:15
общий
Не питайте ложных иллюзий, что при ошибке "Access violation..." у Вас показывается строка с ошибкой.Подумаю еще. Если что-нибудь придумаю, то напишу Вам.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
26.12.2006, 20:19
общий
Попробуйте на двух разных машинах запустить Вашу программу, будет ли выскакивать эта ошибка.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
27.12.2006, 09:19
общий
На другой машине пробовал - эффект тот же (единственно не удалось попробовать на другой ОС), все эксперименты делались на WinXP.Даже пробовал на Дельфи 6 и на другой машине - все там же и та же ошибка.Неужели я что-то делаю такое экстраординарное?Неужели никто раньше не бился лбом о подобное?
давно
Мастер-Эксперт
425
4118
27.12.2006, 10:14
общий
О подобном глюке я только от Вас первый раз услышал.И судя по молчанию других экспертов, они тоже с таким не сталкивались.Здесь видимо проглядывает ошибка взаимодействия OLE DB провайдера с установленной у Вас библиотекой msvcrt.dll (это run-time библиотека для Си\Си++).Попробуйте скачать с сайта Микрософт последнюю версию MDAC и установить ее у себя.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
27.12.2006, 10:17
общий
Ссылка:http://www.microsoft.com/downloads/details.aspx?familyid=78CAC895-EFC2-4F8E-A9E0-3A1AFBD5922E&displaylang=ru
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
27.12.2006, 10:40
общий
:)В вопросе я привел версию MDAC (у меня как раз и установлена 2.80sp1). Искал обновления на MDAC2.80sp1 но ничего не нашел подходящего.В этом направлениии я прокопал в первую очередь!!!Т.к. научен "EOleException with message ‘[Microsoft][Драйвер ODBC dBase] Непредвиденная ошибка драйвера внешней базы данных (15877)‘" - которая решилась благодаря сайту Микрософта [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase]"BDE"=dword:00000002
давно
Мастер-Эксперт
425
4118
27.12.2006, 11:26
общий
Видимо я неправильно выразился.Не могло ли быть так, что какая-то установка испортила вот эту самую версию MDAC2.80sp1? Может быть стоит еще раз установить этот MDAC?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа