![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перенос данных из файла в базу INTERBASE [D6, IB6.x, dBase, FoxPro]
nike_fest © (2004-05-28 10:38:00)Уважаемые программисты, прошу помощи или разъясните ситуацию. Из файла *.dbf построчно переношу данные в таблицу Interbase. Один компонент TTable нацелен на файл *.dbf другой через Database соответственно на аналогичную таблицу в базе INTERBASE. Открываю транзакцию, затем команда Table.INSERT, далее присваиваю последовательно по полям данные и в конце команда POST. При достижении конца файла DBF завершаю транзакцию. Изменения не кеширую. Так вот если таблица не большая все нормально, а если записей много, то все зависает, причем примерно на одном и тем же месте. Записывает около 700-800 записей и все. Никаких ошибок, процесс просто останавливается. И еще такие нюансы. Проблем таких не возникает если включено кэширование изменений, и если таблица INTERBASE пуста
avgur (2004-05-28 15:24:00) [1]
> nike_fest (28.05.04 11:23) [11]
> Соловьев, если можно поподробней как использовать этот savepoint?
http://www.ibase.ru/devinfo/savepoints.htm
Reindeer Moss Eater (2004-05-28 13:09:00) [2]Время транзакции уменьшается, но объем изменений производимых в ней остается прежним.
А проблема больших транзакций - это проблема объема, а не длительности.
Значит проблема автора вообще не в транзакциях.
Курдль (2004-05-28 13:04:00) [3]
> Reindeer Moss Eater © (28.05.04 12:19) [27]
> Если проблема была в длиннойтранзакции, то она никуда не
> девается при кешированных изменениях на клиенте.
Она шибко укорачиваетсяна время, затрачиваемое при извлечении полей из файла и добавлении их в DataSet.
Reindeer Moss Eater (2004-05-28 12:19:00) [4]Если проблема была в длинной транзакции, то она никуда не девается при кешированных изменениях на клиенте.
Курдль (2004-05-28 12:05:00) [5]
> 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]
> Неужели? А куда деваются транзакции при этом?
Автоматически открывается вначале, автоматически закрывается в конце или автоматически откатывается в случае ошибки.
(Я говорил о насильственном открытии транзакции).
ЗЫ: Мне кажется, что многим просто нравится само звучное слово "транзакция". Оно, как бы, добавляет разработчику крутизны в досужих разговорах. Вот называлось бы оно навроде "системной кучи"... :)
Sergey13 (2004-05-28 11:57:00) [6]2nike_fest (28.05.04 10:49) [3]
>Пробовал через квери - тоже самое, а COMMIT не очень хочется, потому что надо писать либо все либо ничего.
Делай как говорит Johnmen, но не в основную таблу а во "временную"/промежуточную. После окончания всей закачки перенос в основную.
Reindeer Moss Eater (2004-05-28 11:54:00) [7]И все! Никаких изнасилованных транзакций и тем более savepoint-ов!
Неужели? А куда деваются транзакции при этом?
Johnmen (2004-05-28 11:53:00) [8]>Курдль © (28.05.04 11:50) [21]
>Я удивляюсь, о чем вы спорите? Что может быть проще:
Проще, быстрее и нересурсокритично простой INSERT INTO
Соловьев (2004-05-28 11:52:00) [9]
> [21] Курдль © (28.05.04 11:50)
ну-ну...
Курдль (2004-05-28 11:50:00) [10]Я удивляюсь, о чем вы спорите? Что может быть проще:
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:34:00) [11][16] - это не урл, а путь на диске после установки ФБ 1.5 :)
Reindeer Moss Eater (2004-05-28 11:33:00) [12]Удалить вставленное если что то не вставилось.
Каждое вставленное запоминать в списке.
nike_fest (2004-05-28 11:31:00) [13]Reindeer Moss Eater, commit - это и есть завершение транзакции на сервере, и как интересно можно одновременно с этим реализовать логикой программы
Соловьев (2004-05-28 11:29:00) [14]firebird_root\doc\sql.extensions\README.savepoints
Курдль (2004-05-28 11:29:00) [15]
> Проблем таких не возникает если включено кэширование изменений
А какие противопоказания против этого метода? На мой взгдяд использование кэшированных изменений - и есть самый оптимальный метод. Никаких savepoint-ов и прочих геморроев.
Главное - грамотно прописать SQL-команды на Insert в UpdateObject или IBDataSet.
nike_fest (2004-05-28 11:27:00) [16]Соловьев, вообщем ничего. Я не знаю как использовать это ФБ1.5. Если объяснять долго, то может ссылку на какую-нибудь документацию укажи
Reindeer Moss Eater (2004-05-28 11:25:00) [17]Коммитить как советуют здесь, а принцип "либо все - либо ничего" реализовать логикой программы, а не транзакциями сервера.
nike_fest (2004-05-28 11:24:00) [18]Tomkat, спасибо большое, но надо программно :)
Соловьев (2004-05-28 11:24:00) [19]
> [11] nike_fest (28.05.04 11:23)
что не понятно в том тексте что я указал?
nike_fest (2004-05-28 11:23:00) [20]Соловьев, если можно поподробней как использовать этот savepoint?