Текущий архив: 2004.06.20;
Скачать: CL | DM;
Вниз
Перенос данных из файла в базу INTERBASE Найти похожие ветки
← →
nike_fest (2004-05-28 10:38) [0]Уважаемые программисты, прошу помощи или разъясните ситуацию. Из файла *.dbf построчно переношу данные в таблицу Interbase. Один компонент TTable нацелен на файл *.dbf другой через Database соответственно на аналогичную таблицу в базе INTERBASE. Открываю транзакцию, затем команда Table.INSERT, далее присваиваю последовательно по полям данные и в конце команда POST. При достижении конца файла DBF завершаю транзакцию. Изменения не кеширую. Так вот если таблица не большая все нормально, а если записей много, то все зависает, причем примерно на одном и тем же месте. Записывает около 700-800 записей и все. Никаких ошибок, процесс просто останавливается. И еще такие нюансы. Проблем таких не возникает если включено кэширование изменений, и если таблица INTERBASE пуста
← →
Reindeer Moss Eater © (2004-05-28 10:41) [1]А если Луна на небе полная, то как идет копирование?
← →
Johnmen © (2004-05-28 10:44) [2]1. Просто запрос INSERT INTO ... в таблицу IB БД в цикле по всем записям из TTable.
2. COMMIT через каждые ~500 вставок.
← →
nike_fest (2004-05-28 10:49) [3]Johnmen, Пробовал через квери - тоже самое, а COMMIT не очень хочется, потому что надо писать либо все либо ничего.
← →
slgeo © (2004-05-28 10:52) [4]
> to nike_fest (28.05.04 10:49) [3]
Есть ли триггеры на таблицу? Если есть, то хорошо бы привести их код.
← →
Tomkat (2004-05-28 10:53) [5]Поробуй коммитить транзакцию после каждой вставки, использовать параметрический запрос вставки и использовать не IBTable, а IBDataSet...
← →
Johnmen © (2004-05-28 10:55) [6]>nike_fest
Для ускорения массовой вставки имеет смысл отключить индексы для таблицы-рецепиента... (во как загнул :))
← →
Соловьев © (2004-05-28 10:56) [7]
> [3] nike_fest (28.05.04 10:49)
Переходи значит на ФБ 1.5 - там есть классная фишка savepoint start;
сохраняешь точку отката в начале и и все, комить себе каждые 500 записей и , а если надо сделать откат - возвращаешся к точке - rollback to start;
← →
Reindeer Moss Eater © (2004-05-28 10:59) [8]Коммитить как советуют, а принцип либо все либо ничего реализовать логикой программы, а не транзакциями сервера.
← →
goozman (2004-05-28 11:11) [9]А не кажется ли Тебе, что глючит InterBase! Попробуй переустновить!
← →
Tomkat (2004-05-28 11:22) [10]Могу посоветовать тулзу IntrBase DataPump , встраивается в IBExpert , как внешний модуль , для переноса данных ...
← →
nike_fest (2004-05-28 11:23) [11]Соловьев, если можно поподробней как использовать этот savepoint?
← →
Соловьев © (2004-05-28 11:24) [12]
> [11] nike_fest (28.05.04 11:23)
что не понятно в том тексте что я указал?
← →
nike_fest (2004-05-28 11:24) [13]Tomkat, спасибо большое, но надо программно :)
← →
Reindeer Moss Eater © (2004-05-28 11:25) [14]Коммитить как советуют здесь, а принцип "либо все - либо ничего" реализовать логикой программы, а не транзакциями сервера.
← →
nike_fest (2004-05-28 11:27) [15]Соловьев, вообщем ничего. Я не знаю как использовать это ФБ1.5. Если объяснять долго, то может ссылку на какую-нибудь документацию укажи
← →
Соловьев © (2004-05-28 11:29) [16]firebird_root\doc\sql.extensions\README.savepoints
← →
Курдль © (2004-05-28 11:29) [17]
> Проблем таких не возникает если включено кэширование изменений
А какие противопоказания против этого метода? На мой взгдяд использование кэшированных изменений - и есть самый оптимальный метод. Никаких savepoint-ов и прочих геморроев.
Главное - грамотно прописать SQL-команды на Insert в UpdateObject или IBDataSet.
← →
nike_fest (2004-05-28 11:31) [18]Reindeer Moss Eater, commit - это и есть завершение транзакции на сервере, и как интересно можно одновременно с этим реализовать логикой программы
← →
Reindeer Moss Eater © (2004-05-28 11:33) [19]Удалить вставленное если что то не вставилось.
Каждое вставленное запоминать в списке.
← →
Соловьев © (2004-05-28 11:34) [20][16] - это не урл, а путь на диске после установки ФБ 1.5 :)
← →
Курдль © (2004-05-28 11:50) [21]Я удивляюсь, о чем вы спорите? Что может быть проще:
for i := 0 to число_записей_в_файле - 1 do
begin
IBDataSet.Append;
IBDataSet.FieldByName("имя_поля").As... := значение_из_файла;
...
IBDataSet.Post;
следующая_запись_в_файле;
end;
try
IBDataBase.ApplyUpdates([IBDataSet]);
except
on E: EDataBaseError do ShowMessage(E.Message);
end;
И все! Никаких изнасилованных транзакций и тем более savepoint-ов!
← →
Соловьев © (2004-05-28 11:52) [22]
> [21] Курдль © (28.05.04 11:50)
ну-ну...
← →
Johnmen © (2004-05-28 11:53) [23]>Курдль © (28.05.04 11:50) [21]
>Я удивляюсь, о чем вы спорите? Что может быть проще:
Проще, быстрее и нересурсокритично простой INSERT INTO
← →
Reindeer Moss Eater © (2004-05-28 11:54) [24]И все! Никаких изнасилованных транзакций и тем более savepoint-ов!
Неужели? А куда деваются транзакции при этом?
← →
Sergey13 © (2004-05-28 11:57) [25]2nike_fest (28.05.04 10:49) [3]
>Пробовал через квери - тоже самое, а COMMIT не очень хочется, потому что надо писать либо все либо ничего.
Делай как говорит Johnmen, но не в основную таблу а во "временную"/промежуточную. После окончания всей закачки перенос в основную.
← →
Курдль © (2004-05-28 12:05) [26]
> Johnmen © (28.05.04 11:53) [23]
> Проще, быстрее и нересурсокритично простой INSERT INTO
Согласен. Но менее гуманно к пользователю. При кэшированных изменениях можно в случае ошибки поправить что-то в НД и повторить ApplyUpdates. А INSERT INTO вызывается при каждой OnApplyRecord из UpdateObject/InsertSQL или IBDataSet/InsertSQL.
> Reindeer Moss Eater © (28.05.04 11:54) [24]
> Неужели? А куда деваются транзакции при этом?
Автоматически открывается вначале, автоматически закрывается в конце или автоматически откатывается в случае ошибки.
(Я говорил о насильственном открытии транзакции).
ЗЫ: Мне кажется, что многим просто нравится само звучное слово "транзакция". Оно, как бы, добавляет разработчику крутизны в досужих разговорах. Вот называлось бы оно навроде "системной кучи"... :)
← →
Reindeer Moss Eater © (2004-05-28 12:19) [27]Если проблема была в длинной транзакции, то она никуда не девается при кешированных изменениях на клиенте.
← →
Курдль © (2004-05-28 13:04) [28]
> Reindeer Moss Eater © (28.05.04 12:19) [27]
> Если проблема была в длинной транзакции, то она никуда не
> девается при кешированных изменениях на клиенте.
Она шибко укорачивается на время, затрачиваемое при извлечении полей из файла и добавлении их в DataSet.
← →
Reindeer Moss Eater © (2004-05-28 13:09) [29]Время транзакции уменьшается, но объем изменений производимых в ней остается прежним.
А проблема больших транзакций - это проблема объема, а не длительности.
Значит проблема автора вообще не в транзакциях.
← →
avgur © (2004-05-28 15:24) [30]
> nike_fest (28.05.04 11:23) [11]
> Соловьев, если можно поподробней как использовать этот savepoint?
http://www.ibase.ru/devinfo/savepoints.htm
Страницы: 1 вся ветка
Текущий архив: 2004.06.20;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.03 c