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

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

TIBQuery и Out of Memory (help) [D6, IB6.x]


Страницы:   1 2

A_Gura ©   (2002-12-16 06:27:00) 

Люди!!!! В чем проблема???
Использую IBX TIBQuery. Из файла читаю запись, проверяю ее наличие в БД (запрос на выборку), если запись отсутствует - вставляю ее в БД (insert).

Записей много!!!

Короче при выполнении запроса на выборку большое кол-во раз (более 2000) вываливается ошибка Out of Memory. Сразу добавлю: я сам память не выделяю (т.е. это не моя ошибка)...


A_Gura   (2002-12-16 09:24:00) [21]

Я уже сказал, что хранимые процедуры не покатят (см. пред. ответы)...

Отгрузка базы у меня хранится в XML-документе, в этом же документе описана структура (список таблиц, поля в них, с указанием того, какие ключевые, а какие нет). Последовательно читаю записи. Для каждой формирую запрос на выборку (т.е. запрос с параметрами, где параметры содержат значения ключевых полей).

Далее, если запрос возвращает запись, то переходим к следующей, иначе формируем запрос на вставку новой записи, выполняем его, и переходим к следующей... Повторюсь: записей много - несколько тысяч.


Sergey Masloff   (2002-12-16 09:09:00) [22]

Напиши поподробнее что и как ты там вставляешь.

Кстати, вот пример процедуры для IB которая делает Insert или Update в звыисимости от наличия записи
---------------------------------------------------------
CREATE PROCEDURE INSERT_OR_UPDATE_MY_TABLE (
P_ID INTEGER,
P_FIELD1 NUMERIC(15,4),
P_FIELD2 VARCHAR(10),
......
P_REMARK VARCHAR(255))
AS
DECLARE VARIABLE V_K INTEGER;
begin
V_K = NULL;
FOR SELECT ISN FROM MY_TABLE
WHERE ID=:P_ID
INTO :V_K
AS CURSOR TMPCURSOR
DO
UPDATE MY_TABLE M
SET
ID = :P_ID,
FIELD1 = :P_FIELD1,
FIELD2 = :P_FIELD2,
...........
WHERE CURRENT OF TMPCURSOR;
IF (V_K IS NULL) THEN
INSERT INTO MY_TABLE(ID,
FIELD1,
FIELD2,
...
)
VALUES(:P_ID,
:P_FIELD1,
:P_FIELD2,
....
);
end
------------------------------------------------------


A_Gura   (2002-12-16 09:04:00) [23]

Хранимая процедура не покатит... У меня выгрузка БД в XML (перемещается по области)... Таблица в базе не одна, а на каждую хранимую процедуру делать сам понимаешь...

А насчет моего вопроса: добавил строчку IBQuery.Params.Clear;
стало больше записей съедать... Не знаю что и делать, може т вообще компонент динамический создавать...


Andriano   (2002-12-16 07:47:00) [24]

Ты по ним по всем пробегаешь, для того чтобы найти?

Почему ошибка не знаю, но можно сделать проще.
Сделай хранимую проц. Ей передавай в качестве параметров, поля новой записи, а она, проверив наличие такой записи, добавит или игнорирует её.

Определять количество записей нужно select count(Уникальное_Значение) from Таблица_1, т.е. ещё одна процедура.


Страницы:   1 2

Наверх

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