Q&A

  • Excel을 DB화 하다가 34,000건이 넘으면 멈쳐요..
사용 환경은 델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;
2  COMMENTS
  • Profile
    신승철 2002.10.12 01:12
    excel의 row가 많은듯하네요.
    excel의 MAX row수가 65536죠.
    중간중간에 commit이 필요하다고 봅니다.
    db에 buffer를 충분히 사용하지않아서 그럴경우도 있기때문이죠.

  • Profile
    아폴론 2002.10.12 02:36

    빠르게 답변해 주셔서 감사합니다.
    님의 말씀대로 그렇게 했더니 아무 이상없이 잘 됩니다.
    좋은 가을 보내십시요. 정말 감사합니다.