Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Реализация DataPump в Delphi


Автор: CKBeg 1.12.2006, 12:42
Мастера написал на Delphi аналог DataPump. Но прога моя в разы в скорости отстает от DataPump.
Причем именно при вставке скорость низкая. Пишу под BDE. Данные из Oracle в Paradox заливаю.  
Теперь вопрос как прога DataPump так быстро заливает? 
может быть он не через Table1.Insert вставляет? Если так, то где можно об этом почитать?

p.s. Datapump- прога для перемещения данных из одной базы в другую. Поставляется вместе с Delphi

Автор: x77 4.12.2006, 14:44
CKBeg, для быстрой вставки нужно использовать TQuery и вставлять непосредственно командой insert into. это во первых. во вторых, если для работы используется TDataSet либо его потомок - неплохо бы ему говорить DisableControls/EnableControls. 

Автор: CKBeg 5.12.2006, 09:20
Цитата

для быстрой вставки нужно использовать TQuery и вставлять непосредственно командой insert into


Нет. Ты не правильно говоришь. Как раз таки для файловой БД(в нашем случае Paradox) не надо юзать SQL, 
для этого лучше Table1.Insert. 

Цитата

TDataSet либо его потомок - неплохо бы ему говорить DisableControls/EnableControls


Да ты прав насчет этого, но у меня визулизация вставляемых записей не используется. 

Я так посмотрел может быть он(Datapump) юзает компонент TBatchMove с опцией Copy. А вообще 
где можно про это почитать? нет разницы на каком языке

Автор: x77 5.12.2006, 15:11
потестить, увы, не вышло - через несколько секунд интенсивной вставки вылетает "Table is full". будет время - попробую на ноуте с базой на флешке, там, наверное, более наглядно будет....

что касается BatchMove, то почитать про него можно в исходниках ;) он, собственно, делает вот что:

Код

      Check(DbiBatchMove(nil, Source.Handle, nil, Destination.Handle,
        EBATMode(BatchMode), FieldCount, PWord(FieldMap), nil, nil, 0,
        ConvertName(FKeyViolTableName, SKeyViolName),
        ConvertName(FProblemTableName, SProblemName),
        ConvertName(FChangedTableName, SChangedName),
        @FProblemCount, @FKeyViolCount, @FChangedCount,
        FAbortOnProblem, FAbortOnKeyViol, FMovedCount, FTransliterate));


функция dbiBatchMove, как раз, и выполняет все операции. с достаточной долей вероятности можно предположить, что она работает с таблицами напрямую... поскольку внутренний код BDE закрыт, остаётся только юзать уже готовую функцию так, как это сделано в TBatchMove (компонент описан в DbTables и ничего сверхьестественного из себя не представляет).

Автор: CKBeg 10.12.2006, 16:21
Цитата

потестить, увы, не вышло - через несколько секунд интенсивной вставки вылетает "Table is full"


для этой ошибки я поставил в BDE настройках: Native->Paradox->BLOCK SIZE=64 ТЫС. С КОПЕЙКАМИ

Полезная штука. Аж в разы увеличивается вместимость paradox'а. А вообще ты в какое время сидишь в нете, я по аське постучусь.

Добавлено @ 16:22 
да нет тестить не стоит, я и SQL'ом пробовал и Table1.Insert'ом тоже. Последняя в разы быстрее

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)