Форум: "Базы";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизВопрос по 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c