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

ADO 如何可以在加快以下處理速度呢?

答題得分者是:johnny2212
SleepWalker
一般會員


發表:16
回覆:20
積分:12
註冊:2004-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-21 14:18:19 IP:220.130.xxx.xxx 未訂閱
try if CheckBox1.Checked then begin ADOQuery1.Close; ADOQuery2.Close; ADOQuery1.SQL.Text := 'Select * from CISRTDataTbl2 Where chDataDateTime < ' chr(39) NowTime chr(39); ADOQuery2.SQL.Text := 'Select * from CISRTDataTbl where chDataDateTime < ' chr(39) 'Empty' chr(39); ADOQuery1.Open; ADOQuery2.Open; ItemCounter := 0; StatusBar1.Panels.Items[4].Text := IntToStr(ADOQuery1.RecordCount); if ADOQuery1.RecordCount <> 0 then begin try ADOConnection2.BeginTrans; for I := 1 to ADOQuery1.RecordCount do begin Application.ProcessMessages; if ForceExit then begin ADOQuery1.Close; ADOQuery2.Close; Exit; end; StatusBar1.Panels.Items[2].Text := IntToStr(ADOQuery1.RecordCount); ADOQuery2.Append; for J := 0 to ADOQuery1.FieldCount - 1 do begin Application.ProcessMessages; if ForceExit then begin ADOQuery1.Close; ADOQuery2.Close; Exit; end; ADOQuery2.Fields.Fields[j].AsVariant := ADOQuery1.Fields.Fields[j].AsVariant; end; ADOQuery2.Post; ADOQuery1.Next; Inc(ItemCounter); end; ADOConnection2.CommitTrans; except ADOConnection2.RollbackTrans; end; end; StatusBar1.Panels.Items[2].Text := '0'; StatusBar1.Panels.Items[4].Text := '0'; ADOQuery1.Close; ADOQuery2.Close; ADOQuery1.SQL.Text := 'Delete from CISRTDataTbl2 Where chDataDateTime < ' chr(39) NowTime chr(39); ADOQuery1.ExecSQL; end; except Memo1.Lines.Add(LogTime ' - ' 'Error 167'); end; try ADOConnection1.Close; ADOConnection2.Close; except Memo1.Lines.Add(LogTime ' - ' 'Error 174'); Exit; end;
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-21 16:56:34 IP:211.79.xxx.xxx 未訂閱
看起來好像只是完全複製data 您能用類似這樣的式子取代原來那堆 .next 迴圈嗎    
  begin tran
  Delete from CISRTDataTbl2 Where chDataDateTime < ..
  insert into CISRTDataTbl where chDataDateTime <....
  commit tran
  ...
johnny2212
初階會員


發表:34
回覆:65
積分:39
註冊:2003-04-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-23 22:46:51 IP:61.226.xxx.xxx 未訂閱
我大概看了一下你的程式,主要影響速度的應該是"轉檔"這兩行 // ADOQuery2.Fields.Fields[j].AsVariant := ADOQuery1.Fields.Fields[j].AsVariant; // ADOQuery2.post 您希望加快速度,我必須告訴你,一但你使用了資料庫交易,資料庫就會做 Record lock 或是會做Table lock,速度一定會變慢,這是沒辦法的事,針對你的程式我提出以下幾個建議: 1 你既然使用了Application.ProcessMessage 代表你是要考慮Client端的執行時間和感受,你可改用StoreProcedure,因為Client端一但呼叫完成後會分離,後續由Database自己去做,就算速度非常慢,Client端也感覺不出來(ExecuteSql 不會傳回值),缺點就是不同的資料庫有不同的語法,不論學習或移植的確比較麻煩 2 將你以上的程式改成Thread,TADOQuery 放入DataModule中,不要放在Form上,由Thread 動態Creat DataModule,只要你的Application 沒有Termate掉(就算單一的Form關掉),程式還是會放入BackGround中一直執行,但有一定的危險(如Client端發生問題或突然中斷) 3 使用Multi-tier,按照上述的方式,由AP獨立去運作,這樣當然是最理想的方法,Client關掉程式,也不會影響AP的運作,我都是用這種做法,但前提你必須會多層次結構 4 將資料一筆一筆insert至資料庫,但是要使用bulk insert(在SQL Server中),你可以自己看SqlServer help,這樣速度應該是最快的(書上說的),在StoreProcedure中應該也可以使用,交易的部分(Transaction)一樣傳入SQL指令,不過我沒有這樣用過,有興趣不妨試看看,別忘了告訴我結果
SleepWalker
一般會員


發表:16
回覆:20
積分:12
註冊:2004-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-01 09:36:23 IP:220.130.xxx.xxx 未訂閱
恩! 謝謝了喔
系統時間:2024-09-19 11:29:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!