Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.29;
Скачать: CL | DM;

Вниз

dbf -> interbase (2)   Найти похожие ветки 

 
Фикус ©   (2003-09-10 13:31) [0]

Как можно ускорить процесс исполнения следующего кода:


begin
Table1.Open;
Table1.First;
while not Table1.Eof do
begin
fam:=Table1.FieldByName("FAM").AsString;
im:=Table1.FieldByName("IM").AsString;
ot:=Table1.FieldByName("OT").AsString;
data:=Table1.FieldByName("DATA").AsString;
ser:=Table1.FieldByName("SER").AsString;
num:=Table1.FieldByName("NUM").AsString;
smo:=Table1.FieldByName("SMO").AsString;
IBQuery1.Active:=False;
IBQuery1.SQL.Text:="insert into person (FAM,IM,OT,DATA,SER,NUM,SMO) values (""+fam+"",""+im+"",""+ot+"",""+data+"",""+ser+"",""+num+"",""+smo+"")";
IBQuery1.Active:=True;
Table1.Next;
end;
Table1.Close;
end;


Заранее благодарен!


 
Zacho ©   (2003-09-10 13:44) [1]

Вместо IBQuery использовать TIBSQL, а вместо динамического формирования запроса использовать параметризированный запрос. И еще, если записей много, то делать commit после каждых примерно 10000 записей. Да, на время этой операции в таблице person желательно отключит индексы, триггера и ограничения.


 
Фикус ©   (2003-09-10 13:45) [2]

[1] Zacho © (10.09.03 13:44)

Огромное спасибо за развернутый ответ! :)


 
Alexandr ©   (2003-09-10 13:47) [3]

еще заменить FielDByName на более быстродействующее
TableFAM
или fields[1]


 
Zacho ©   (2003-09-10 13:49) [4]

Да, еще пара замечаний. Вместо fam:=Table1.FieldByName("FAM") быстрее будет Table1.Fields[n]
И конечно, IBQuery1.Active:=True; - ошибочно.


 
Zacho ©   (2003-09-10 13:53) [5]


> Фикус © (10.09.03 13:45) [2]

Что-то надо объяснить более подробно ? Не стесняйся :) , скажи что именно.


 
Danilka ©   (2003-09-10 13:55) [6]

например, вот-так, на вскидку, может можно и быстрее:

ibsql.transaction.StartTransaction;
ibsql.text:="insert into person (FAM,IM,OT,DATA,SER,NUM,SMO) values (:fam,:im,:ot,:data,:ser,:num,:smo)";
ibsql.prepare;
Table1.Open;
Table1.First;
while not Table1.Eof do
begin
ibsql.params.vars[0].asString := Table1.Fields[0].AsString;
ibsql.params.vars[1].asString := Table1.Fields[1].AsString;
ibsql.params.vars[2].asString := Table1.Fields[2].AsString;
ibsql.params.vars[3].asString := Table1.Fields[3].AsString;
ibsql.params.vars[4].asString := Table1.Fields[4].AsString;
ibsql.params.vars[5].asString := Table1.Fields[5].AsString;
ibsql.params.vars[6].asString := Table1.Fields[6].AsString;
ibsql.ExecQuery;
Table1.Next;
end;
ibsql.transaction.Commit;
Table1.Close;
end;

может и не работает, не проверял... :))
но, думаю, смысл понятен.


 
Danilka ©   (2003-09-10 13:56) [7]

хех, пока сочинял уже и ответили..


 
Фикус ©   (2003-09-10 14:11) [8]

Спасибо всем ответившим!

[6] Danilka © (10.09.03 13:55)

Отдельное спасибо за время потраченное на написание кода. Смысл понятен :)



Страницы: 1 вся ветка

Текущий архив: 2003.09.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
3-96144
DelphiM
2003-09-08 13:44
2003.09.29
Помогите не пойму


8-96311
Дима
2003-05-31 01:01
2003.09.29
средства работаты с платами видеозахвата


3-96117
Rel_
2003-09-09 08:53
2003.09.29
Проблема с кодировкой


1-96267
Relaxxx
2003-09-18 10:50
2003.09.29
TreeView


3-96116
P0tia
2003-09-09 10:21
2003.09.29
Как узнать количество листов в Excel