Вниз
Скачать: 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.022 c
1-1100284015
Robin Hood
2004-11-12 21:26
2004.11.28
Как мне из строки достать название формы или кнопки для использов


14-1100240303
Павел
2004-11-12 09:18
2004.11.28
Запуск delphi c другого компьютера.


6-1095318349
maxistent
2004-09-16 11:05
2004.11.28
"ТИХАЯ" проверка коннекта


1-1100384466
Лев Ландау
2004-11-14 01:21
2004.11.28
Тонкости WebBrowser ...


9-1091015986
Evgeniy_K
2004-07-28 15:59
2004.11.28
Параметры экрана




   Наверх