![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скоросная закачка в Interbase [D6, IB6.x]
Ptr © (2002-06-25 09:01:00)ПОМОГИТЕ СОВЕТОМ!!!
Закачка в InterBase 5934 записей продолжается 6 мин 12 сек !!!
Пробывал разные варианты:
- IBTable.Append;
- IBDataSet.Append;
- IBSQL.ExecQuery("insert into Base1 (Field1, ... Field10)
values (:Value1, ... :Value10)");
Разница в секундах.
А может быстре InterBase не может ???
(Сервер локальный и сеть не влияет.)
Ptr (2002-06-25 09:27:00) [21]procedure ImportAccount;
var StartT,EndT: TTime;
begin
IBDM.IBOperList.DisableControls;
wwDBGrid1.BeginUpdate;
StartT := Time;
try
while SRow <= ERow do // Определены выше
try
MainStatusBar.Panels[1].GaugeAttrs.Position := Trunc(SRow*100/ERow);
if not IBDM.AppendAccount(SRow,IBDM.IBOperList) then
raise Exception.Create(Ошибка записи. Строка: "+ IntToStr(SRow)+ " Sheet: "+ Sh.Name);
Inc(SRow);
MainForm.Refresh;
except
On E: Exception do
begin
MessageDlg(E.Message,mtError,[mbOK],0);
if ShowExcelErrorRow(sh.Name,SRow) then
Continue;
exit;
end;
end;
finally
IBDM.IBOperList.EnableControls;
wwDBGrid1.EndUpdate;
EndT := Time;
ShowMessage(TimeToStr(EndT-StartT));
end;
end;
//............................................................................
function TIBDM.AppendAccount(ExcelRw: integer; Base: TIBDataSet): boolean;
type
TImportField = record
x1, x2, x3: ShortString;
Date: TDateTime;
x4,x5,x6,x7: Currency;
end;
var
PR: TImportField;
begin
Result := true;
// check EXCELdata
with ExcelWorksheet do
begin
PR.x1:= Name;
if VarIsEmpty(Cells.Item[ExcelRw,1].value) then exit
else PR.Date := Cells.Item[ExcelRw,1].value;
if Cells.Item[ExcelRw,2].FormulaR1C1 = "" then PR.x2:= "-"
else PR.x2:= Cells.Item[ExcelRw,2].FormulaR1C1;
if Cells.Item[ExcelRw,3].FormulaR1C1 = "" then PR.x3:= "-"
else PR.x3:= Cells.Item[ExcelRw,3].FormulaR1C1;
if VarIsEmpty(Cells.Item[ExcelRw,5].Value) then PR.x4:= 0
else PR.x4:= RoundTo(Cells.Item[ExcelRw,5].value,-2);
if VarIsEmpty(Cells.Item[ExcelRw,6].Value) then PR.x5:= 0
else PR.x5:= RoundTo(Cells.Item[ExcelRw,6].value,-2);
if VarIsEmpty(Cells.Item[ExcelRw,7].Value) then PR.x6:= 0
else PR.x6:= RoundTo(Cells.Item[ExcelRw,7].value,-2);
if VarIsEmpty(Cells.Item[ExcelRw,8].Value) then PR.x7:= 0
else PR.x7:= RoundTo(Cells.Item[ExcelRw,8].value,-2);
end;
if not Base.Locate(Pole1; Pole2; Pole3; Pole4; Pole5; Pole6; Pole7; Pole8",VarArrayOf([PR.x1,PR.Date,PR.x2,PR.x3,PR.x4,PR.x5,PR.x6,PR.x7]),[]) then
with Base do
try
// try
IBSQL.ParamByName("x1").AsString := PR.x1;
IBSQL.ParamByName("x2").AsDateTime := PR.Date;
IBSQL.ParamByName("x3").AsString := PR.x2;
IBSQL.ParamByName("x4").AsString := PR.x3;
IBSQL.ParamByName("x5").AsDouble := RoundTo(ExcelWorksheet.Cells.Item[ExcelRw,4].Value,-2);
IBSQL.ParamByName("x6").AsDouble := PR.x4;
IBSQL.ParamByName("x7").AsDouble := PR.x5;
IBSQL.ParamByName("x8").AsDouble := PR.x6;
IBSQL.ParamByName("x9").AsDouble := PR.x7;
IBSQL.ParamByName("x10").AsDouble := RoundTo(ExcelWorksheet.Cells.Item[ExcelRw,16].Value,-2);
IBSQL.ParamByName("x11").AsDouble := RoundTo(ExcelWorksheet.Cells.Item[ExcelRw,17].Value,-2);
IBSQL.ParamByName("x12").AsDouble := RoundTo(ExcelWorksheet.Cells.Item[ExcelRw,18].Value,-2);
IBSQL.ParamByName("x13").AsDouble := RoundTo(ExcelWorksheet.Cells.Item[ExcelRw,19].Value,-2);
IBSQL.ExecQuery;
except on E: Exception do
begin
Base.Cancel;
MessageDlg(E.Message, mtError,[mbOk], 0);
Result := false;
end;
end;
end;
Alexandr (2002-06-25 09:25:00) [22]быстрее должно быть через IBSQL, и транзакцию после каждого инсерта не дергай.
И индексы отключи и триггеры. Вот тогда быстродействие будет нормальным.
И главное ForceWrites не забудь выключить
Kaban (2002-06-25 09:09:00) [23]а код можно взглянуть
Ptr (2002-06-25 09:07:00) [24]Данные беруться из Excel?, но при отключении непосредственно операции записи т.е. // IBComponent.Воткнуть запись
Все работает менее 1 сек.
Kaban (2002-06-25 09:02:00) [25]а откуда данные беруться?