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

有關更新資料庫的問題~

答題得分者是:herbert2
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-17 01:32:15 IP:61.57.xxx.xxx 訂閱
Hi All,
最近要寫一個資料庫的小程式,當我刪除資料時,資料卻沒有在資料庫檔案刪除??
我透過了 TTable (delete function ), TQuery( SQL command ex : Delete FORM DataTable WHERE ID = ' 10' ) ,
TADOTable, TADOQuer也是透過跟相同的方式去刪除資料。
雖然TTable上面顯示 該資料已經刪除,但是當我開啟資料庫的檔案時,該筆資料如何才能真正的將該筆資料從資料庫檔案中移除掉呢??Thanks.

我使用的資料庫系統為 Foxpro 5

careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-17 23:22:59 IP:59.126.xxx.xxx 訂閱
您使用 TTable 或 TQuery 之後有下 ApplyUpdates 的語法嗎?

===================引 用 ldd 文 章===================
Hi All,
最近要寫一個資料庫的小程式,當我刪除資料時,資料卻沒有在資料庫檔案刪除??
我透過了 TTable (delete function ), TQuery( SQL command ex : Delete FORM DataTable WHERE ID = ' 10' ) ,
TADOTable, TADOQuer也是透過跟相同的方式去刪除資料。
雖然TTable上面顯示 該資料已經刪除,但是當我開啟資料庫的檔案時,該筆資料如何才能真正的將該筆資料從資料庫檔案中移除掉呢??Thanks.

我使用的資料庫系統為 Foxpro 5

------
價值的展現,來自於你用哪一個角度來看待它!!
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-18 00:30:48 IP:61.57.xxx.xxx 訂閱
感謝您的回答~因為之前試了會出現execption所以就沒再試了,之前查了一下資料 TTable要使用ApplyUpdates 需要設定CachedUpdates.剛剛把該屬性設成true後,執行ApplyUpdates Method就不會出現execption了。
下面是我執行的指令
Table1->Delete();
Table1->ApplyUpdates();
Table1->Active = false;
Table1->Active = true;
但是透過foxpro開啟資料庫查看資料,還是一樣的結果,資料只是被標記為刪除,並未真正的從資料表裡面移除...

另外請問一下 使用CachedUpdates與不使用有差別嗎?如果我不使用CachedUpdates我只要執行Table1->Delete(); DBGrid就會更新狀態,是否有使用CachedUpdates是否影響效能呢???Thanks.
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-18 15:33:33 IP:211.72.xxx.xxx 訂閱
FoxPro 的檔案類似 DBASE III Plus 之 .DBF 檔, 刪除只是 Mark 為 Deleted.
BCB 用 SQL 92 標準指令處理 Flat Table,
好像沒有類似 PACK (移除已 Mark 為 Deleted 的 Record) 的指令可用.
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-21 12:58:25 IP:61.57.xxx.xxx 訂閱
感謝您的回覆~
我用 ADOQuery 可以使用 PACK指令~但是使用前必需將 ADOConnect斷線後連線~不然會顯示 File is in use的 exeception的錯誤訊息~
但是我用 select * from xxx_table 將所有的資料select出來~
該 FORM可以 新增 刪除 上一筆 下一筆~ 當刪除後執行-> 斷線->連線 使用者此時如果按 Next, Prev , Add , delete會導致錯誤
Can't operator closed dataset....但是即使我把 ADOQuery 的 Active設成 ture 還是一樣...只能再做一次 select * from xxx_table
但是這樣有個問題 當我要刪除的 第100筆資料 然後要刪除 第101資料時
當我重新select * from xxx_table時 又會跳到第1筆資料.另外一個問題 每次都要 select * from xxx_table 我想這樣的效能應該不是很好~
不知各位前輩是否有好的辦法呢??謝謝~~~


===================引 用 herbert2 文 章===================
FoxPro 的檔案類似 DBASE III Plus 之 .DBF 檔, 刪除只是 Mark 為 Deleted.
BCB 用 SQL 92 標準指令處理 Flat Table,
好像沒有類似 PACK (移除已 Mark 為 Deleted 的 Record) 的指令可用.
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-21 20:31:15 IP:211.72.xxx.xxx 訂閱
執行 PACK 須在該檔無任何其它 Session 開啟該檔的情況下執行, 應不須每刪一筆就執行一次吧?
以往 Clipper 的程式, 運作情形也是如此, 故另提供一 Function 供 User 自行擇期 PACK.

重 Open 當然會跳到 First, 故若有需要, 可於 PACK 前保存次筆的 Key, Reopen 後再用 Loacte 移至該筆.
(若要刪的是末筆, 則保存前一筆的 Key)
編輯記錄
herbert2 重新編輯於 2008-12-21 20:32:35, 註解 無‧
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-22 09:45:56 IP:82.210.xxx.xxx 訂閱
感謝您的回覆~我會再試試看~如果方便是否告知 紀錄的Method呢?Thanks.
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-12-22 22:35:07 IP:211.72.xxx.xxx 訂閱
在 DataSet 之 BeforeDelete 執行:
(1) 用 TBookMaker 記錄將刪之 Record
(2) 執行 DisableControls() 令螢幕上之 DB 元件顯示的內容不因 DataSet 移動 Record 而變動
(3) 執行 DataSet 之 Next(), 若非 Eof 則保存該 Record 之 Key 值供 Reopen 後之 Locate() 用
若已 Eof 則 Go BookMaker 再做 Prior(), 保存該 Record 之 Key 值供 Reopen 後之 Locate() 用
Key 值要用 Variant Array 保存.
(4) Go 回將 Delete 之 Record
(5) 執行 EnableControls() 復原

在 DataSet 之 AfterDelete 執行:
(1) 執行 DataSet Close()
(2) 執行 DataSet Open()
(3) 執行 DataSet Locate(), 要注意 Key Field List 為一欄與多欄要用不同之參數.
一欄時: Locate(String KeyName, Variant KeyValue, TLocateOptions Options)
多欄時: Locate(String KeyNameList, VarArrayOf(Variant KeyValueArray, int ArrayCount-1),
TLocateOptions Options)

===================引 用 ldd 文 章===================
感謝您的回覆~我會再試試看~如果方便是否告知 紀錄的Method呢?Thanks.
系統時間:2024-04-19 13:11:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!