Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по interbase [D6, IB6.x]


Sergy Ivanec ©   (2004-11-03 01:04:00) 

Здравствуйте. Вообщем появиась у меня проблема. Не могу решить уже 4 день. Может кто поможет.
Есть ibdatabase, ibtransaction, ibquery,а также Tstrings с боьшим числом запросов (где-то 130000), все соединено с базой (крое этого на форме различные датасеты, дбгриды и т.п.) Использую примерно такой код добавления:
   for i:=0 to 130000 do begin
    ibquery.sql.clear;
    ibquery.sql.add(sq.strings[i]);
    ibquery.execsql;
   end;
ibtransaction.CommitRetaining;
showmessage('Загружено');

При этом где-то в районе showmessage вылезает access violation...

Тоже самое вылезает на апдейт большого кол-ва записей. И при этом ошибка появляется только если запускать программу отдельно.
Если из делфи - все проходит на ура. Кроме этого может так получится, что один раз данный цикл пройет, а при перезапуске нет.
Я не очень хорошо разбираюсь в IB, перучитал уже гору информации, но не нашел ответа. Очень похоже на то, что я замусориваю память запросом, но как я понимаю, освобождать память после execsql не требуется. Пытался создавать все компоненты динамически и выполнять запрос -та же ошибка.
Буду очень благодарен за ответ.


Sergy Ivanec   (2004-11-03 08:28:00) [1]

Громадное всем спасибо. Все заработало. Update тоже на порции по 1000 поделил :-)


ЮЮ   (2004-11-03 07:47:00) [2]

>А вообще-то у автора код лучше,

Особенно, (где-то 130000) и for i:=0 to 130000 do :)

for i := 0 to sq.Count - 1


Deniz   (2004-11-03 06:39:00) [3]

> S@shka ©   (03.11.04 01:33) [1]
>Но, надо понимать что EXEC - не вернет тебе наружу никаких данных

Так про возврат никто не говорил.
А вообще-то у автора код лучше, вот только Commit/CommitRetaining надо делать не после 130000, а порционально, например по 1000.
for i:=0 to 130000 do begin
 if not IBTransaction.InTransaction then
   IBTransaction.StartTransaction
 IBQuery.sql.clear;
 IBQuery.sql.add(sq.strings[i]);
 IBQuery.execsql;
 if (i mod 1000) = 0 then
   IBTransaction.CommitRetaining;
end;
if IBTransaction.InTransaction then
 IBTransaction.CommitRetaining;

Кстати, если в IBTransaction выполняются только эти запросы, то можно и Commit делать.


S@shka   (2004-11-03 01:33:00) [4]

ibtransaction.StartTransaction;
i := 0;
while (i < sq.count) do
begin
   ibquery.sql.clear;
   ibquery.sql.add(sq.strings[i]);
   ibquery.execsql;
   ibquery.close; // хотя не обязательно делается по clear
   sleep (1);
inc (i);
end;
ibtransaction.Commit;
showmessage('Загружено');

Но, надо понимать что EXEC - не вернет тебе наружу никаких данных


Наверх

Титульная страница Поиск, карта сайта Написать письмо