Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.54 MB
Время: 0.023 c
4-1081945308
Aleksandr
2004-04-14 16:21
2004.06.20
Объясните, люди добрые, как работать с GetASuncKeyState?


3-1085494417
linx
2004-05-25 18:13
2004.06.20
После внесения изменений в базу не могу подключиться снова.


3-1085050345
JohnS
2004-05-20 14:52
2004.06.20
Инструмент для древовидной структуры


3-1085648034
Andrew_S
2004-05-27 12:53
2004.06.20
Проблема с LookUp полями


1-1086366335
Wily
2004-06-04 20:25
2004.06.20
Работа с командной строкой...