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

什麼情況下適合去壓縮修復ACCESS之.mdb資料庫?

答題得分者是:tech_state
ry_lee
高階會員


發表:368
回覆:251
積分:123
註冊:2002-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-27 22:11:00 IP:211.74.xxx.xxx 未訂閱
大家好: 以前習慣用bde及paradox之.db,我似乎肯定在刪除.db之記錄後該.db檔案大小會變小,最近從討論區看到有人之.mdb因記錄增加而大到50mb大小且全部刪除後.mdb之大小不變,因我最近也改用.mdb做資料庫,我的.mdb有2000筆記錄大小有1300kb,當我全部刪除我的.mdb大小不變,想請教大家幾個問題: 1.為何全部刪除.mdb之記錄後.mdb之大小不變? 2.什麼情況下適合去壓縮修復ACCESS之.mdb資料庫? 3.貴站提供許多壓縮修復程式(點選 Project | Import Type Library, 選擇 Micro$oft Jet and Replication Objects 2.1 Library (Version 2.1),然後按 Create 便可以產生 JRO_TLB.pas)修復後總是另外產生一個新的.mdb,請問可以在修復後不另外新生一個.mdb資料庫?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-27 22:30:10 IP:202.39.xxx.xxx 未訂閱
1.以小弟道聽塗說所知, mdb 的刪除只是 "標記" 為刪除, 並非真的刪除 所以即使刪除了 record, 但 mdb 之 size 仍不變 2.有問題的時候, 就試著去做修復的動作 3.沒有辦法, 您得在修復或壓縮的動作完成後,  以新產的的 mdb 去覆蓋掉舊的    --- 每個人都是一本書
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-27 22:52:52 IP:203.204.xxx.xxx 未訂閱
ry_lee, 您好 (1)就我所知,只要是資料庫,對於user所做的刪除動作皆非確實刪除,僅只是標記,只要透過某些工具依舊可以救回標記的資料(Record),因為被標記的資料還是存在資料庫裡的。只有在做過壓縮(pack)之後,才會將標記的資料(Record)做真正刪除的動作。所以不管是.mdb或是paradox的.db檔,若未做pack的動作,而只做刪除的動作,應該size都不會變小。    (2)就我所知壓縮與修復應是二個不同的動作。壓縮:是將標記的資料做刪除的動作,真正的刪除而非標記,至於在什麼情形下要做這個動作,我想答案是隨您高興,您可以每天做,也可以一個星期做一次,也可以一個月或是一年做一次。修復:資料庫有可能因為某些原因而造成資料損壞,資料亂掉,此時就需要做修復的動作。    (3)sorry, 我不會Delphi所以無法回答這個問題,這個問題就留待Delphi的前輩先進們來答覆了。 以上為個人想法,如有錯誤,請指正。 ================================= <>涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 <>是非終日有,不聽自然無 <>天下本無事,庸人自擾之
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-27 22:58:57 IP:61.56.xxx.xxx 未訂閱
你好: 這是節錄自【Microsoft Data Access Technical Articles Overview】的範例文章,看看說不定能給你一些幫助。 Compacting a Database As a database file is used, it can become fragmented as objects and records are created and deleted. Periodic defragmentation reduces the amount of wasted space in the file and can enhance performance. Compacting can also repair a corrupted database. The following listings demonstrate how to compact a database. Note Use JRO, not ADO to compact a database. DAO Sub DAOCompactDatabase() ' Make sure there isn't already a file with the ' name of the compacted database. If Dir(".\NewNorthWind.mdb") <> "" Then Kill ".\NewNorthWind.mdb" ' Basic compact - creating new database named newnwind DBEngine.CompactDatabase ".\NorthWind.mdb", ".\NewNorthWind.mdb" ' Delete the original database Kill ".\NorthWind.mdb" ' Rename the file back to the original name Name ".\NewNorthWind.mdb" As ".\NorthWind.mdb" End Sub JRO Sub JROCompactDatabase() Dim je As New JRO.JetEngine ' Make sure there isn't already a file with the ' name of the compacted database. If Dir(".\NewNorthWind.mdb") <> "" Then Kill ".\NewNorthWind.mdb" ' Compact the database je.CompactDatabase "Data Source=.\NorthWind.mdb;", _ "Data Source=.\NewNorthWind.mdb;" ' Delete the original database Kill ".\NorthWind.mdb" ' Rename the file back to the original name Name ".\NewNorthWind.mdb" As ".\NorthWind.mdb" End Sub The JRO CompactDatabase method takes two connection strings that indicate the source database and destination database respectively. See the JRO online help for more information on the JRO CompactDatabase method.
ry_lee
高階會員


發表:368
回覆:251
積分:123
註冊:2002-03-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-28 17:55:48 IP:211.74.xxx.xxx 未訂閱
引言: ry_lee, 您好 (1)就我所知,只要是資料庫,對於user所做的刪除動作皆非確實刪除,僅只是標記,只要透過某些工具依舊可以救回標記的資料(Record),因為被標記的資料還是存在資料庫裡的。只有在做過壓縮(pack)之後,才會將標記的資料(Record)做真正刪除的動作。所以不管是.mdb或是paradox的.db檔,若未做pack的動作,而只做刪除的動作,應該size都不會變小。 以上為個人想法,如有錯誤,請指正。 ================================= 涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 是非終日有,不聽自然無 天下本無事,庸人自擾之
我將試驗結果發表一下: 用TTable元件連接一個paradox之.db檔,記錄筆數約2000筆,.db檔大小為288k,如果用TTable.delete方法刪除全部記錄,.db檔大小依舊不變為288k,如果用TTable.EmptyTable方法刪除全部記錄,.db檔大小變為2k,原始碼如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids, ExtCtrls, DBCtrls; type TForm1 = class(TForm) DBNavigator1: TDBNavigator; DBGrid1: TDBGrid; DataSource1: TDataSource; Table1: TTable; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin table1.EmptyTable;//記錄不見且.db檔大小變為2k table1.Close; table1.Open; end; procedure TForm1.Button2Click(Sender: TObject); begin table1.First; while not table1.Eof do begin table1.Delete; table1.Next; end; table1.Close; table1.Open; //記錄不見但,.db檔大小依舊不變為288k end; procedure TForm1.FormActivate(Sender: TObject); begin table1.Active:=false ; table1.Exclusive:=true;//必須不然稍後呼叫table1.EmptyTable會有錯誤 table1.Open; end; end; end.
系統時間:2024-11-25 8:39:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!