Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Вопрос по interbase   Найти похожие ветки 

 
Sergy Ivanec   (2004-11-03 01:04) [0]

Здравствуйте. Вообщем появиась у меня проблема. Не могу решить уже 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 не требуется. Пытался создавать все компоненты динамически и выполнять запрос -та же ошибка.
Буду очень благодарен за ответ.


 
S@shka ©   (2004-11-03 01:33) [1]

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 - не вернет тебе наружу никаких данных


 
Deniz ©   (2004-11-03 06:39) [2]

> 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 делать.


 
ЮЮ ©   (2004-11-03 07:47) [3]

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

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

for i := 0 to sq.Count - 1


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.024 c
14-1100036659
некто
2004-11-10 00:44
2004.11.28
А почему так?


1-1100480011
Rosl
2004-11-15 03:53
2004.11.28
E файлы


4-1097839922
Leaner
2004-10-15 15:32
2004.11.28
Местонахождение WINDOWS SYSTEM32 DRIVERS


1-1100444283
bloodman
2004-11-14 17:58
2004.11.28
Как создать TWebBrowser в ран-тайм?


8-1093770518
DimOn2
2004-08-29 13:08
2004.11.28
Avi