全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1909
推到 Plurk!
推到 Facebook!

如何實現TXT轉入SQL最快.

答題得分者是:andychang1690
ye_top1
一般會員


發表:22
回覆:22
積分:9
註冊:2002-05-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-21 13:33:39 IP:210.75.xxx.xxx 未訂閱
請教各位先進.本人需要將TXT考勤資料轉入SQL.有實現此功能.但是轉3000筆資料需要10分鐘.時間太長.USER常常以為電腦當機.不知是否有更好更快方式轉入. var fromfile:textfile; str:string; s1,s2,s3 :string; begin //打開原始檔 Assignfile(fromfile,'c:\WR.txt'); reset(fromfile); //寫入SQL DB中 WHILE not EOF(FROMFILE) DO begin ReadLn(fromfile,str); s1 := copy(str,1,3); s2 := copy(str,4,4); s3 := copy(str,8,2); begin adoquery1.Close; adoquery1.SQL.Clear; adoquery1.SQL.Add('select * from ATTEND'); adoquery1.Open; adoquery1.ControlsDisabled; adoquery1.Insert; adoquery1.FieldByName('machineno').asstring := s1; adoquery1.fieldbyname('icserial').asstring := s2; adoquery1.FieldByName('machrem').AsString := s3; adoquery1.Post; adoquery1.EnableControls; end; end; closefile(fromfile); showmessage('轉檔作業完畢');
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-21 14:06:39 IP:202.62.xxx.xxx 未訂閱
您好﹗    使用ADO的匯入TXT形態資料的方法試試看﹕
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('Select * Into 資料表名稱 From ');
  ADOQuery1.SQL.Add('[test.txt] In "D:\" "Text;"');
  ADOQuery1.ExecSQL;
end;
========================= 大病初愈﹐休養調整中... =========================
------
忻晟
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-21 15:47:53 IP:220.135.xxx.xxx 未訂閱
若是要快的話使用文字檔確實是最快的方式, 一般若是用Delphi一筆一筆轉, 我會放個TLabel讓他在那邊跳數字, User就不會覺得程式卡住不動 Ex:

Label1.Caption := IntToStr(iCount);
adoquery1.Insert;
adoquery1.FieldByName('machineno').asstring := s1;
adoquery1.fieldbyname('icserial').asstring := s2;
adoquery1.FieldByName('machrem').AsString := s3;
adoquery1.Post;
Inc(iCount);
Application.ProcessMessages;
你的程式碼感覺不太對, 是不是沒有貼完整 我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/10/21 15:48:48
------


我不是高手, 高手是正在銀幕前微笑的人.
ye_top1
一般會員


發表:22
回覆:22
積分:9
註冊:2002-05-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-21 16:59:26 IP:210.75.xxx.xxx 未訂閱
當然Miles 君所說比較好.我也有採用.但是比較關注在程式執行時間上.程式碼沒有貼完整.但是有朋友建議在add 'select * from attend where icserial=''zzz'''.因為where是不可能有符合條件資料.這樣造成僅僅是打開資料庫.如果沒有where就會是全部查詢.速度就會提高.
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-21 17:05:58 IP:220.135.xxx.xxx 未訂閱
Hi ye_top1 你好: 事實上我是看到你的DisableControl及EnableControl所放的位置感到奇怪, 而且3000筆資料十分鐘確實比較久一點, 只有三個欄位的話應該比較快, 所以想說會不會是寫法的問題. 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-21 18:50:46 IP:221.169.xxx.xxx 未訂閱
引言: 請教各位先進.本人需要將TXT考勤資料轉入SQL.有實現此功能.但是轉3000筆資料需要10分鐘.時間太長.USER常常以為電腦當機.不知是否有更好更快方式轉入. var fromfile:textfile; str:string; s1,s2,s3 :string; begin //打開原始檔 Assignfile(fromfile,'c:\WR.txt'); reset(fromfile); //寫入SQL DB中 WHILE not EOF(FROMFILE) DO begin ReadLn(fromfile,str); s1 := copy(str,1,3); s2 := copy(str,4,4); s3 := copy(str,8,2); begin adoquery1.Close; adoquery1.SQL.Clear; adoquery1.SQL.Add('select * from ATTEND'); adoquery1.Open; // adoquery1.ControlsDisabled; adoquery1.Insert; adoquery1.FieldByName('machineno').asstring := s1; adoquery1.fieldbyname('icserial').asstring := s2; adoquery1.FieldByName('machrem').AsString := s3; adoquery1.Post; // adoquery1.EnableControls; end; end; closefile(fromfile); showmessage('轉檔作業完畢');
ye_top1:將上面紅字移到WHILE not EOF(FROMFILE) DO上面 在試試看速度! 你每存一次檔案就開啟一次Table速度當然慢。 請參考。
Andy Chang
------
Andy Chang
TTS
初階會員


發表:72
回覆:66
積分:27
註冊:2003-05-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-13 11:49:59 IP:211.75.xxx.xxx 未訂閱
andychang1690大大 以你指導的方式 迴圈內似乎沒next耶 那回圈會每一筆都跑嗎?
系統時間:2024-07-07 6:53:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!