사용 환경은 델5, 오라클 서버, ADOQuery 를 사용 합니다.
오라클서버에 DB를 만들어 놓고 시작 하면서 기존의 Data를 삭제하고
새로이 데이터를 입력 합니다.
Excel Row가 수천Row 이면 잘 되는데 오늘은 42,000 Row정도의 Excel 파일을 읽어 디비화 시키다가 중간에 약 34,000건 정도에서 DB화 실패 멧세지가
떡~ 하니 나타납니다. 부르지도 않았는데....
카운터를 놓고 보니까 수백건 입력하고 잠간 멈추었다가 다시 수백건
입력되고... 다시 수백건 이러다 종당에는 딱 멈춤니다.
아래는 소스인데요...
고수님들 무었이 잘못되어서 이런가요? 컴의 메모리문제인것 같은데...쩝..
가르쳐 주십시요. 감사합니다.
허접소스 갑니다--------------------------------
with TABbuylow do begin
Open;
if recordcount > 0 then begin
MainFm.DBAmedia.rollback;
Excel.DisplayAlerts:= false;
Excel.Quit;
Excel := unassigned;
showmessage('Temp 데이타 초기화 실패');
Exit;
end;
ADOQuery1.First;
i := 0; Tcount := 0;
while not ADOQuery1.Eof do begin
ac_count.Value := ac_count.Value + 1;
Application.ProcessMessages;
menm := '';adtm := '';yoil := '';secs := '';cost:= '';
prnm := '';
rt01:= '';rt02:= '';rt03:= '';rt04:= '';rt05 := '';rt06:= '';rt07:= '';rt08:= '';
rt09:= '';rt10:= '';rt11:= '';rt12:= '';rt13:= '';rt14:= '';rt15:= '';
inc(i);
Tcount := Tcount + 1;//총 레코드 수 저장
menm := Trim(ADOQuery1.Fields[0].DisplayText); //매체명
if (menm = 'MBC') or (menm = 'KBS2') or(menm = 'SBS') then begin
adtm :=Trim(ADOQuery1.Fields[2].DisplayText); //ad시간
yoil := ADOQuery1.Fields[3].DisplayText; //요일
if yoil = 'Mon' then yoil := '월' else
....
....
if yoil = 'Sun' then yoil := '일';
secs := ADOQuery1.Fields[4].DisplayText; //초수
cost := ADOQuery1.Fields[6].DisplayText; //단가
prnm := TRIM(ADOQuery1.Fields[7].DisplayText); //프로그램명
prnmlen := 0;
prnmlen := Length(prnm);
//====================
try
//아무것도 없는 엑셀 필드라면 에러가난다
//그럴경우를 대비해서 Try ~ Except구문으로 묵어준다
rt01 := ADOQuery1.Fields[8].DisplayText;
....
....
rt15 := ADOQuery1.Fields[22].DisplayText;
except
if rt01 = '' then rt01 := '0';
....
....
if rt15 = '' then rt15 := '0';
end;
//====================
if cost = '' then cost := '0';
with TABbuylow do begin
Insert;
FieldByName('by_byno').asfloat := i;
FieldByName('by_menm').asString := menm;
FieldByName('by_prtm').asString := '';
FieldByName('by_adtm').asString := Copy(adtm,1,5);
FieldByName('by_yoil').asString := yoil;
FieldByName('by_secs').asinteger := strtoint(secs);
FieldByName('by_sigb').asString := ADOQuery1.Fields[5].DisplayText;
FieldByName('by_cost').asfloat := strtofloat(cost)*1000;
FieldByName('by_prnm').asString := Copy(prnm,6,prnmlen);
//====================
FieldByName('by_rt01').asfloat := strtofloat(rt01);
....
.....
FieldByName('by_rt15').asfloat := strtofloat(rt15);
Post;
end;
end else
begin
//mbc,kbs,sbs 가 아니면 입력하지 않음
end;
ADOQuery1.Next;
end;
end;
excel의 MAX row수가 65536죠.
중간중간에 commit이 필요하다고 봅니다.
db에 buffer를 충분히 사용하지않아서 그럴경우도 있기때문이죠.