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

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

Скоросная закачка в Interbase [D6, IB6.x]


Страницы:   1 2

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]

а откуда данные беруться?


Страницы:   1 2

Наверх

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