Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.023 c
3-1097219685
Настенька
2004-10-08 11:14
2004.11.28
синхронизация dbgridов


1-1100646157
CHE
2004-11-17 02:02
2004.11.28
TLABEL


4-1098193970
suharew
2004-10-19 17:52
2004.11.28
Колесико мыши


1-1100260457
nopox
2004-11-12 14:54
2004.11.28
Господа, как можно из 3 строк с уникаль сгенерировать 4-ю?


1-1100229943
vovchik
2004-11-12 06:25
2004.11.28
Расширение *.cmp




   Наверх