CachedUpdates的速度隨筆數增多嚴重下降~~ >"< |
尚未結案
|
kyxiang
一般會員 ![]() ![]() 發表:8 回覆:6 積分:2 註冊:2002-03-11 發送簡訊給我 |
請教各位先進..
我用CachedUpdates的方式將資料讀取至Client端
將其中一個欄位(假設欄位名為"FieldCheck")抓來當作勾選欄位
也就是讓user可以勾選哪些資料要進行處理
Form上有一個Button是 "全選" 的功能
程式碼如下:
Query1.First; While (Not Query1.EOF) do begin Query1.Edit; Query1.FieldByName('FieldCheck').asString:='Y'; Query1.Post; Query1.Next; end; Query1.First;而今遇到一個問題 就是這個迴圈會越跑越慢 才不過幾百筆的資料 跑到後來甚至每跳一筆就要花數秒 從頭到尾全選一遍午覺都睡醒ㄌ... @@ 請教各位先進是否有辦法可以解決? 或是有沒有其他模擬勾選功能的做法? 先謝謝各位了.... |
chih
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
kyxiang
一般會員 ![]() ![]() 發表:8 回覆:6 積分:2 註冊:2002-03-11 發送簡訊給我 |
|
chih
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
以前有做過是再Query1 NEW一個欄位..比如叫做ABC
用這個欄位來記錄'Y' or 'N'.
按存檔時在跑迴圈..
Query1.First;
While (Not Query1.EOF) do
begin
if Query1.FiledByName('ABC').Value='Y' then
begin
Query1.Edit;
Query1.FieldByName('FieldCheck').asString:='Y';
Query1.Post;
Query1.ApplyUpdates;
end;
Query1.Next;
end;
Query1.First;
引言: 如果下ApplyUpdates 那不就把資料即時異動回資料庫去了嗎? 可是如果我要等到user確定要異動資料的時候才對資料庫作異動 而且在異動的同時還會連動到好幾個資料表 所以我會下Transaction 這樣我就不能在勾選的時候就下ApplyUpdates 請問這樣又該如何解決呢?... @@ |
ccchen
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
如果query1有接向任何DBGrid, dbedit等元件的話, 更新顯示會慢下來
query1.disableControls; Query1.First; While (Not Query1.EOF) do begin Query1.Edit; Query1.FieldByName('FieldCheck').asString:='Y'; Query1.Post; Query1.Next; end; Query1.First; query1.EnableControls;可以加快一些 不過若是跳一筆就要花數秒可能還有其中問題 |
kyxiang
一般會員 ![]() ![]() 發表:8 回覆:6 積分:2 註冊:2002-03-11 發送簡訊給我 |
"每跳一筆甚至要數秒鐘" 是我描述的太誇大了點... ^^" 剛剛寫了個小程式整個測了一下
數據如下:
(第一列的數據為單單post)
(第二列的數據為 post & ApplyUpdates)
(第三列的數據為 post & ApplyUpdates & CommitUpdates)
235 筆 360筆 780筆 31.416秒 70.642秒 352.147秒 41.880秒 87.406秒 386.005秒 10.035秒 17.585秒 46.807秒另, 有無 DisableControls 影響大約 10% 可以看得出來ApplyUpdates之後 一定要下CommitUpdates把Buffer內資料真正清空才行 我目前的做法是在user查詢出資料時先把查出的資料放進暫存檔 然後由暫存檔把資料讀出 而User在畫面上的所有異動(包含勾選與否)都ApplyUpdates 並 Commit 算是暫時解決了這個問題 如果有各位先進有更好更有效率的辦法 也請不吝指教... 謝謝 chih 兄 與 ccchen 兄的仗義相助 小弟這裡謝過了~ ^____^ |
dannynet
一般會員 ![]() ![]() 發表:0 回覆:2 積分:0 註冊:2002-12-21 發送簡訊給我 |
|
kyxiang
一般會員 ![]() ![]() 發表:8 回覆:6 積分:2 註冊:2002-03-11 發送簡訊給我 |
|
chih
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
kadee
高階會員 ![]() ![]() ![]() ![]() 發表:11 回覆:141 積分:165 註冊:2002-03-20 發送簡訊給我 |
|
shpeng
初階會員 ![]() ![]() 發表:6 回覆:67 積分:49 註冊:2002-12-21 發送簡訊給我 |
procedure TForm1.Button1Click(Sender: TObject); begin ADODataSet1.LockType := ltBatchOptimistic; ADODataSet1.open; end; procedure TForm1.SpeedButton2Click(Sender: TObject); begin ADOConnection1.BeginTrans; with ADODataSet1 do while not eof do begin edit; Fieldbyname('ddd').asstring := 'x'; post; next; end; ADODataSet1.UpdateBatch; ADOConnection1.CommitTrans; end;測試 8000筆 約11秒 DELPHI5 c-1000 MSSQL c-800 ==取之於斯,用之於斯== 發表人 - shpeng 於 2003/01/22 17:33:42
------
==取之於斯,用之於斯== |
Mickey
版主 ![]() ![]() ![]() ![]() ![]() 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |