вопрос про ADO

программирование базы данных делфи ADO

Есть у меня программка одна, еще на delphi, есть там компонент TADOQuery. Иногда с ним происходят странные глюки (ну,как мне кажется). Если его мышетыкать на форму, а потом вызывать этот query предположим в цикле несколько раз, то у него возникают странные проблемы, после первого вызова он убивается почему-то, и соответственно при втором вызове ругается - access violation. Если создавать TADOQuery руками, то таких проблем нет.
Объясните, или я что-то не понимаю, или это глюки?

Примечание:
а что, кроме минусующей школоты в этом вопросе нормальных людей не было?

Примечание:
crimaniak (Alexey Kulentsov)
очевидно. да только это не так. То есть есть форма, скажем Main на ней есть объект q - TADOQuery. предположим мы делаем простейший цикл
for i=1 to 3 do
begin
q.Close;
q.Sql.Text:= 'select блабла from бла where Sum'+ i + '=10';
q.Open;
end;
q.Close;

так вот, этот замечательный цикл 2 раза отработает, а на третьем скажет при q.Close - access violation. при этом, замечу, что q более нигде не используется, форма с компонентом не закрывается.
при этом работает:

q:=TADOQuery.Create;

for i=1 to 3 do
begin
q.Close;
q.Sql.Text:= 'select блабла from бла where Sum'+ i + '=10';
q.Open;
end;
q.Close;

Примечание:
Werewolf_ (Alex Werewolf)
вы невнимательно прочитали мой вопрос и решили что я не знаю что такое access violation. я отлично понимаю что там access violation и по какой причине. я не понимаю почему уничтожается TADOQuery ровно на третьем шаге цикла. и почему если вместо компонента на форме прописать создание TADOQuery руками, то все работает.

Примечание:
Werewolf_ (Alex Werewolf)
отвечать на ваши вопросы я не вижу смысла, потому что я знаю что объект уничтожается, я знаю на какой строке access violation, я знаю почему он там. я не знаю только одно, почему уничтожился объект.

>P.S.: на счет школоты:
>1. не надо всех судить по себе
мимо. мне 23.

Примечание:
то что сейчас он выпадает на q.Close не значит что q=nil
я проверяла. q=nil

Примечание:
superhuman
а на отработку того же самого селекта во втором случае не нужно время? как он волшебным образом успевает выполняться в отличие от точно такого же в первом? Кроме того я никогда бы не подумала что то, что селект еще выполняется, означает что объекта tadoquery не существует.
Ок, предложите вариант выполнить много однотипных запросов по полям с именами A1, A2, A3, A4 (ну что поделать, БД спроектирована некорректно несколько) без использования цикла, причем не нужно предлагать это все слепить в один запрос.

Примечание:
superhuman
два вопроса:

1. почему тогда во втором случае при том же самом цикле тот же самый запрос выполняется?
2. если объект заблокирован то, он равен nil?

Примечание:
superhuman
1. там те же методы в тех же местах и абсолютно тот же самый запрос, 1 в 1. Open и Close там тоже есть.
2. я понимаю что nil это нулевой указатель. раз q=nil значит q в данный момент не существует. почему?

может быть и разумно написать более 60 запросов руками, а написать простыню из 60 запросов подряд, но мне это почему-то не кажется слишком хорошим выходом..

Примечание:
superhuman
у меня эта чертова прога так на 2/3 написана, ни в одном месте больше нет. Мне вообще кажется несколько странным факт, что он то есть, то нет в зависимости от того как создавать объект.
А и еще, делать вложенные запросы, усложнять существующие мне нельзя, по многим причинам.

Примечание:
вобщем я вижу что дело это пустое, учить как надо делать меня продолжат, а ответа на поставленный вопрос я так и не получу. за сим закрываю вопрос
Ответы:
Очевидно, время жизни этого объекта разное в этих случаях. И все зависит от соотношения формы, цикла и того места, где "создать руками" - что внутри чего находится.
1. Какая версия Delphi?
2. В свойствах проекта( Project - Options...), закладка Compiler поставить флаг Use debug DCUs. Далее Project - Build.
После этих действий на какой строчке будет появляться AV?
3. Что стоит в свойствах q.ExecuteOptions?
Очевидно на отработку select'a нужно время. Какой идиот в цикле запросы делает. Ну тут очевидно... Запрос еще не успел отработать, а уже его меняют.
Да не ждет цикл for пока завершится действие с индексом i=1.
Цикл for уже начинает отрабатывать i=2 при этом ничего не знает успели
ли освободится страницы памяти запроса при i=1.
Т. е. он обращается к объекту ADOQuery а он в это время занят (заблокирован)
Попробуй написать тоже самое только не в цикле а подряд. Т. е.
q:=TADOQuery.Create;
{типа i=1}
q.Sql.Text:= 'select бабла from дать_бабла where Sum'+ 1 + '=100500';
q.Open;
q.Close;
{типа i=2}
q.Sql.Text:= 'select бабла from дать_бабла where Sum'+ 2 + '=100500';
q.Open;
q.Close;
{типа i=3}
q.Sql.Text:= 'select бабла from дать_бабла where Sum'+ 3 + '=100500';
q.Open;
q.Close;
И будет тебе счастье!
1. На методы close и open тратиться время, за которое происходит блокировка (подробнее почему так происходит я уже написал).
2. Блокировкой потоков занимается операционная система.
nil - это нулевой указатель. неправильное использование не присвоенного указателя nil также может вызвать ошибку.
"может быть и разумно написать более 60 запросов руками, а написать простыню из 60 запросов подряд, но мне это почему-то не кажется слишком хорошим выходом.. "
А по-другому будет Access Violation. Или можно использовать множества в SQL со словом IN. Или писать вложенный запрос. Вообщем быдлокодить не рекомендую.


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.