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

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

Перенос данных из файла в базу INTERBASE [D6, IB6.x, dBase, FoxPro]


Страницы:   1 2

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?


Страницы:   1 2

Наверх

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