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

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

Импорт из DBF в FireBird [D7, FireBird 2.0]


Страницы:   1 2

MZ ©   (2007-05-31 09:46:00) 

Делаю импорт из Dbf в FireBird. Один Commit на весь импорт. Записей примерно 100000.  Так вот импорт существенно замедляется... Первые 10000 записей импортируются примерно за 1 минуту, а последние около 20 мин. Как с этим бороться?


MZ   (2007-05-31 11:49:00) [1]


> > Через InsertSQL? А в качестве параметров передовать значения
> > полей qDBFQuery? Это быстрее?
>
> не поверишь, да :)

Огромное спасибо.... Через InsertSQl с параметрми 100000 записей влетели за 2 минуты....


Jan1   (2007-05-31 11:02:00) [2]


> Через InsertSQL? А в качестве параметров передовать значения
> полей qDBFQuery? Это быстрее?

не поверишь, да :)

А ты вообще читаешь документацию по том что юзаешь?

Quick Data Operations

   * Direct SQL statements execution with the help of TpFIBQuery.
   * Packet record processing in the TpFIBQuery.BatchInput, TpFIBQuery.BatchOutput methods.
   * Fast and efficient non-buffered select of records in TpFIBQuery.
   * Direct execution of stored procedures by TpFIBQuery.ExecProcedure method.
   * Convenient processing of BLOB-fields.


Sergey13   (2007-05-31 11:00:00) [3]

> [20] MZ   (31.05.07 10:39)

напиши запрос (отдельный кверик TIBQuery или TIBSQL или их аналоги из фибов)
insert into dest_table(перечень полей) values(перечень параметров)
В цикле присваивай параметрам значения из DBF и выполняй. При этом можно играться с коммитом через разные промежутки записей.


MZ   (2007-05-31 10:56:00) [4]


> Не пытайся для больших объемов работать на делфи с таблицей
> позиционным способом.


Так каким образом делать импорт?
> SQL надо учить.

Подскажи


ANB   (2007-05-31 10:50:00) [5]


> MZ   (31.05.07 10:46) [23]

Не пытайся для больших объемов работать на делфи с таблицей позиционным способом.
Да и вообще, позиционный способ подходит только для редактирования юзером, чтобы он без полного рефреша видел свои изменения (если работает с гридом).
SQL надо учить.


MZ   (2007-05-31 10:46:00) [6]


> Да это вообще уже пофигу. Самая порочная практика - работать
> с SQL сервером, как с DBF.
>

Если можно поясни....


ANB   (2007-05-31 10:44:00) [7]


> MZ   (31.05.07 10:39) [20]

И причем тут InsertSQL . . . .


ANB   (2007-05-31 10:43:00) [8]


> > dataSet.FN('Принимающее поле1').asString:=qDBFQuery.Fields[1].
>
> > asStreing;

Да это вообще уже пофигу. Самая порочная практика - работать с SQL сервером, как с DBF.


MZ   (2007-05-31 10:39:00) [9]


> Что бы положить деньги в кошелек не нужно пересчитывать
> в нем наличность.
> Зачем ты пишешь в отурытый датасет? Пиши напрямую в базу
> запросом.
>

Через InsertSQL? А в качестве параметров передовать значения полей qDBFQuery? Это быстрее?


Jan1   (2007-05-31 10:37:00) [10]


> dataSet.FN('Принимающее поле1').asString:=qDBFQuery.Fields[1].
> asStreing;

в огороде бузина а в Киеве дядько...
в одном месте по индексу, в другом через метод...


Jan1   (2007-05-31 10:35:00) [11]


> Пользуюсь FIBPlus

ну там должен быть компанент аналогичный IBSQL


MZ   (2007-05-31 10:34:00) [12]


> почему Dataset а не IBSQL?
>


Пользуюсь FIBPlus


Sergey13   (2007-05-31 10:34:00) [13]

> [13] MZ   (31.05.07 10:32)

Что бы положить деньги в кошелек не нужно пересчитывать в нем наличность.
Зачем ты пишешь в отурытый датасет? Пиши напрямую в базу запросом.


Jan1   (2007-05-31 10:33:00) [14]

+ параметры.


Jan1   (2007-05-31 10:33:00) [15]


> DataSet

почему Dataset а не IBSQL?


MZ   (2007-05-31 10:32:00) [16]


>
> какой код?
>



try
Tr.SrartTransaction;

while not qDBFQuery.eof do
begin
DataSet.Insert;
dataSet.FN('Принимающее поле1').asString:=qDBFQuery.Fields[1].asStreing;
dataSet.FN('Принимающее поле2').asString:=qDBFQuery.Fields[2].asStreing;
...........................................
DataSet.Post;
If (qDBFQuery.RecNo mod 1000)=0 then
 if Tr.Active then
  begin
  Tr.Commit;
  Tr.StartTransaction;
  end;
end;
Tr.Commit;
except
Tr.RollBack;
end;



Что-то типо того


Jan1   (2007-05-31 10:23:00) [17]


> Делаю импорт из Dbf в FireBird.

какой код?


MZ   (2007-05-31 10:21:00) [18]


>
> > Поле Varchar(9
>
> А ты часом не проверяешь по этому полю, что запись была
> уже добавлена ?
>

Нет


ANB   (2007-05-31 10:18:00) [19]


> Поле Varchar(9

А ты часом не проверяешь по этому полю, что запись была уже добавлена ?


Jan1   (2007-05-31 10:16:00) [20]


> if (DataSet.RecNo mod 1000)=0 then Tr.Commit

а как по другому? ну разве что еще счетчик свой завести... Ну и не забыть после цикла проверить что активна транзакция и закоммитить ее...


Страницы:   1 2

Наверх

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