![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
dbf -> interbase (2)
Фикус © (2003-09-10 13:31:00)
Как можно ускорить процесс исполнения следующего кода:
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;
Заранее благодарен!
Фикус (2003-09-10 14:11:00) [1]
Спасибо всем ответившим!
[6] Danilka © (10.09.03 13:55)
Отдельное спасибо за время потраченное на написание кода. Смысл понятен :)
Danilka (2003-09-10 13:56:00) [2]
хех, пока сочинял уже и ответили..
Danilka (2003-09-10 13:55:00) [3]
например, вот-так, на вскидку, может можно и быстрее:
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;
может и не работает, не проверял... :))
но, думаю, смысл понятен.
Zacho (2003-09-10 13:53:00) [4]
> Фикус © (10.09.03 13:45) [2]
Что-то надо объяснить более подробно ? Не стесняйся :) , скажи что именно.
Zacho (2003-09-10 13:49:00) [5]
Да, еще пара замечаний. Вместо fam:=Table1.FieldByName("FAM") быстрее будет Table1.Fields[n]
И конечно, IBQuery1.Active:=True; - ошибочно.
Alexandr (2003-09-10 13:47:00) [6]
еще заменить FielDByName на более быстродействующее
TableFAM
или fields[1]
Фикус (2003-09-10 13:45:00) [7]
[1] Zacho © (10.09.03 13:44)
Огромное спасибо за развернутый ответ! :)
Zacho (2003-09-10 13:44:00) [8]
Вместо IBQuery использовать TIBSQL, а вместо динамического формирования запроса использовать параметризированный запрос. И еще, если записей много, то делать commit после каждых примерно 10000 записей. Да, на время этой операции в таблице person желательно отключит индексы, триггера и ограничения.