Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

Перенос данных из файла в базу 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.039 c
3-1085577800
starik30
2004-05-26 17:23
2004.06.20
Decimal


1-1086233758
rtf
2004-06-03 07:35
2004.06.20
Как узнать количество дней между двумя датами?


6-1081936453
V@LER@N
2004-04-14 13:54
2004.06.20
Packet Capture


1-1086761992
artem_123
2004-06-09 10:19
2004.06.20
вопрос по mainmenu


1-1086608450
tria
2004-06-07 15:40
2004.06.20
Напомните пож. ситаксис описания:





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский