有關更新資料庫的問題~ |
答題得分者是:herbert2
|
ldd
一般會員 發表:12 回覆:62 積分:19 註冊:2004-07-06 發送簡訊給我 |
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 發送簡訊給我 |
您使用 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 發送簡訊給我 |
感謝您的回答~因為之前試了會出現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 發送簡訊給我 |
|
ldd
一般會員 發表:12 回覆:62 積分:19 註冊:2004-07-06 發送簡訊給我 |
感謝您的回覆~
我用 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 發送簡訊給我 |
執行 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 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
在 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. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |