什麼情況下適合去壓縮修復ACCESS之.mdb資料庫? |
答題得分者是:tech_state
|
ry_lee
高階會員 發表:368 回覆:251 積分:123 註冊:2002-03-19 發送簡訊給我 |
大家好:
以前習慣用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 發送簡訊給我 |
|
tech_state
版主 發表:44 回覆:638 積分:641 註冊:2003-02-10 發送簡訊給我 |
ry_lee, 您好
(1)就我所知,只要是資料庫,對於user所做的刪除動作皆非確實刪除,僅只是標記,只要透過某些工具依舊可以救回標記的資料(Record),因為被標記的資料還是存在資料庫裡的。只有在做過壓縮(pack)之後,才會將標記的資料(Record)做真正刪除的動作。所以不管是.mdb或是paradox的.db檔,若未做pack的動作,而只做刪除的動作,應該size都不會變小。 (2)就我所知壓縮與修復應是二個不同的動作。壓縮:是將標記的資料做刪除的動作,真正的刪除而非標記,至於在什麼情形下要做這個動作,我想答案是隨您高興,您可以每天做,也可以一個星期做一次,也可以一個月或是一年做一次。修復:資料庫有可能因為某些原因而造成資料損壞,資料亂掉,此時就需要做修復的動作。 (3)sorry, 我不會Delphi所以無法回答這個問題,這個問題就留待Delphi的前輩先進們來答覆了。 以上為個人想法,如有錯誤,請指正。 =================================
<>涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。>
<>是非終日有,不聽自然無>
<>天下本無事,庸人自擾之>
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
這是節錄自【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 發送簡訊給我 |
引言: 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. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |