線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1873
推到 Plurk!
推到 Facebook!

資料庫記錄刪除後的位置

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-03 02:06:55 IP:61.67.xxx.xxx 未訂閱
請問各位:

這個問題已困擾我很久, 假設一個資料(透過dbgrid顯示出來)有10筆記錄, 我下query1.delete 及資料進行 applyupdate, commit之後, 由於當筆指標已消失, 所以記錄指標會回到第一筆, 因此我做了以下的方式
procedure TForm1.DeleteClick(Sender: TObject);
var nowREC: TBookMarkStr;
begin
nowREC:= Query1.BookMark;
Query1.Delete;
Query1.ApplyUpdates;
Transactions.CommitRetaining;
Query1.BookMark:= nowREC;
setlength(nowREC,0);
end;
此法雖可令刪除當筆記錄後移到原筆的下方, 但又出現一個問題, 如果我是刪除最後一筆時, 此法會移到 Eof指標而造成錯誤, 所以我又改了上面紅色字體的部份
try
if (Query1.Eof) and (Query1.Bof) then
else Query1.BookMark:= nowREC;
except
end;
setlength(nowREC,0);
如此可以避免刪除最後一筆產生錯誤, 可是在刪除最後一筆後, 記錄指標卻已然回到第一筆
我想要的動作是
無論刪除那一筆, 記錄指標不要回到第一筆, 而是可以停在刪除當筆的下一筆, 如果刪除最後一筆後, 指標仍會停留在最後一筆, 可是我不想使用Last指令, 因為Last會造成資料庫移動記錄很大的負擔, 不知是否還有其他方法?
try
if (Query1.Eof) and (Query1.Bof) then Query1.Last
else Query1.BookMark:= nowREC;
except
end;
setlength(nowREC,0);
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-03 02:53:45 IP:59.114.xxx.xxx 訂閱
剛測試一下,在正常的情況下,使用Query搭配DBGrid,下Query.Delete; Query.ApplyUpdates; Commit;
記錄指標並不會亂跳,既使刪除最後一筆,記錄指標依然會留在最後一筆…
您可否先將有關BookMark的程式先刪除掉,測試一下。或將code全部顯示供debug…

~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-03 22:51:46 IP:61.67.xxx.xxx 未訂閱
抱歉, 忘了提一件事, 我使用 FireBird 1.52 for Win32 的 InterBase架構, 不知是否為資料庫的關係
使用 Paradox 資料庫並不會如此
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-03 22:57:28 IP:59.114.xxx.xxx 訂閱
所以您是用IBDatabase及IBQuery囉,sorry…FireBird資料庫沒有用過…



===================引 用 文 章===================
抱歉, 忘了提一件事, 我使用 FireBird 1.52 for Win32 的 InterBase架構, 不知是否為資料庫的關係
使用 Paradox 資料庫並不會如此
------
~小弟淺見,參考看看~
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-04 19:34:39 IP:61.67.xxx.xxx 未訂閱
嗯! 正是~
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-04-07 09:11:15 IP:220.134.xxx.xxx 訂閱
P.D前輩:

我有一個蠻爛的想法不知道可不可行,就是刪除時,先移上或移下一筆紀錄(視情況判斷),然後記憶BookMark
然後移回要刪除的紀錄,待刪除後,再移到BookMark的位置,不知道這樣是否可行?

我只會出餿主意!哈哈!

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-04-08 21:20:58 IP:61.67.xxx.xxx 未訂閱
此法我也曾想過, 但並不實際
1.如果只有一筆時, 其實無法這個動作, 所以按此法仍會造成 Eof 或 Bof 的問題
2.Bookmark 的功能並不像以前dos 的 dbase 一樣會記憶位置, 一旦 commit 之後, 記錄在bootmark的變數內的
記錄指標就已消減, 所以並無法按我們所想像的可以正常指向我們要的記錄位置
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-04-08 21:25:53 IP:220.134.xxx.xxx 訂閱

===================引 用 文 章===================
此法我也曾想過, 但並不實際
>> 1.如果只有一筆時, 其實無法這個動作, 所以按此法仍會造成 Eof 或 Bof 的問題
如果先計算紀錄筆數,若只有一筆直接一移到第一筆!

>>2.Bookmark 的功能並不像以前dos 的 dbase 一樣會記憶位置, 一旦 commit 後, 記錄在bootmark的變數內的
>>記錄指標就已消減, 所以並無法按我們所想像的可以正常指向我們要的記錄位置

若是紀錄KEY欄位的條件呢?自己用變數紀錄,不用Bookmark 變數不知道是否可以少掉一些困擾!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-04-08 21:43:01 IP:61.67.xxx.xxx 未訂閱
想不到 g兄這麼快就有回覆, 不過就所提的綜合想法, 
如果單為一個刪除要花那麼大陣仗的話, 似乎有點不值得投資, 因為這對一個上百萬的資料庫來說, 無疑是一大負擔, 謝謝!
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-04-08 21:59:05 IP:220.134.xxx.xxx 訂閱
P.D前輩:
其實我對資料庫的議題很感興趣,但是Delphi對很多資料庫都沒有提供原生的良好支援,像我現在還是用ADO來處理我的資料庫問題,
畢竟元件盤上找的到!
至於會不會導致資料庫緩慢,我是覺得值得一試,或許也是個解決方案,畢竟有問題才有我們存在的價值! 至於百萬筆的資料庫是否值得這樣作,
我有一個個人的經驗,一般使用者對系統的使用經驗,是否能貼近於日常相似實際的作業,將決定我們系統的價值與友善度!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-04-09 13:37:24 IP:61.67.xxx.xxx 未訂閱
稱呼前輩不敢當, 我十分認同g兄的看法, 的確一套軟體寫的再完美再好, 叫好不叫痤, 不友善, 不親和, 它仍然是一個失敗的作品, 不過不好意思, 無法觸犯您的想法, 我原來的想法只是希望刪除記錄在commit之後不會讓記錄又回到第一筆就可以了, 而以我po上來的做法即可以達到目的, 效能也不差, 看看是否還有更好更合理的做法值得大家來討論, 因為如果要先計算筆數用count()來算會產生一個query的資源, 也會損耗n倍時間, 或用loop來找出是否only one, 會造成該記錄指標不斷移動, 很有可能造成移來移去時最後刪掉不該刪的記錄, 其實風險性很高, 
其實我對於sql的bookmark一直很垢病, 因為它似乎不是我們想像中那麼容易掌控(不像dbase中的recno那般簡單明白), 不過討論到這邊有些離題了, 是否還有其他更好的想法, 歡迎大家一起來討論! 謝謝!
系統時間:2024-05-19 14:41:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!