为什么ACCESS的 。MDB 文件 SIZE 增加这么快?(200分)

A

askall

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个程序使用到 ACCESS 的数据库
每次向其中一个只有两个字段的表输入一条数据该MDB文件就增加好几K
只是增加一条记录,没有修改和删除操作。
可这个字段只有一个10字节的文本字段,一个日期型字段。
这样没使用多久,一个几 M 的 MDB 文件就增长到几十,上百 M 了。
使用ACCESS压缩之后就又小了。
请问这是什么原因?如何通过设置 ACCESS 不让它增长这么快?
我知道可以用程序对该MDB进行压缩
我用的是BCB6 有没有什么好办法?
 
我也有这个问题,但我觉得如果不涉及删除就不应该增加这么快。
 
它替换数据,空间是重新分配的,所以全部更新一次数据,空间大一倍,当然大了,压缩后
ACCESS能把虚空的空间收回来,当然小多了。
 
如何在程序中解决呢,我只会在ACCESS中压缩。
 
使用dao压缩,ACCESS也是用它来压缩的,具体办法大富翁论坛中N多,我的常用办法:
1。使用DIMAOND控件来压缩,方便实惠,量又足,我一直用它
2。用DAO原生对象压缩,稍复杂些,但可以不用外部控件,文件应该可以小些。
 
本来想好事做到底,把我的源代码贴上来,一看,在家里的机器上,唉,没办法了。
 
下次记得贴了,thx!
 
如数据量少,可把数据导出,删除原mdb
 
Access 数据库如果增减频繁,那么一定要常使用压缩功能,这个功能是通过 Jet 数据库引擎(JetEngine)
的 CompactDatabase 方法(JRO)实现的。
我以前用VB 6 时,常使用 Access 数据库,但转到 Delphi 6 时就只用 FlashFiler 2 做桌面数据库了,以
下给出的是 VB 的例子,详细的使用方法和参数请看 Office 安装光盘上的 MSJRO.CHM (Microsoft Jet and
Replication Objects) 文件。

本范例演示如何使用 CompactDatabase 方法压缩和加密数据库。

Public Sub CompactAndEncrypt()

Dim je As New JRO.JetEngine

' Make sure that a file doesn't exist with the name of
' the compacted database.
If Dir("C:/Program Files/Microsoft Office/" & _
"Office/Samples/Northwind2.mdb") <> "" Then Kill _
"C:/Program Files/Microsoft Office/Office/Samples/Northwind2.mdb"

' Compacts and encrypts version Northwind database.
je.CompactDatabase _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:/Program Files/Microsoft Office/" & _
"Office/Samples/Northwind.mdb", _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:/Program Files/Microsoft Office/" & _
"Office/Samples/Northwind2.mdb;" & _
"Jet OLEDB:Encrypt Database=True"

End Sub

----------------------
使用 Jet 和 Replication 对象,可以:

1.创建和同步数据库复本集。
2.压缩数据库,并指定压缩数据库的选项,例如,密码和加密。
3.通过将挂起的数据更改写入数据库、并将数据库中最新的数据读入内存来刷新内存缓存。

 
最常用的就是DAO了;
var
db:OLEVariant;
tempFile: String;
begin
result:=false;
try
screen.Cursor := crSQLWait;
if not DAOActive(db) then
//begin
//MessageBox(0,'系统没有DAO3.6驱动程序,无法压缩,请安装OFFICE2000','提示',MB_ICONINFORMATION);
exit;
//end;
try
filename:='你的数据库.mdb';
tempFile:='t.mdb';
db.CompactDatabase(filename,tempfile,'',0,';pwd=你的密码');
//db.CompactDatabase(filename,tempfile,'',0,';');//不带密码的用法
deleteFile(filename);
RenameFile(tempfile,filename);
MessageBox(0,'压缩成功','提示',MB_ICONINFORMATION);
result:=true;
except
MessageBox(0,'压缩失败,可能是其它程序也打开了此数据库,请退出其它程序后再试。','错误',MB_ICONERROR);
end;
finally
db:=Unassigned;
Screen.Cursor:=crDefault;
end;
 
//数据库压缩
procedure TfrmMain.DataZIP;
var
wPath,TargetFileName,SourceFileName:string;
DAOVersion:integer;
dao:OLEVariant;
begin
wPath:=ExtractFilePath(ParamStr(0));
TargetFileName:=wPath+'compacted.mdb';
SourceFileName:=wPath+'card.mdb';
dmmain.ADOConnection.Connected :=false;
if fileexists('C:/Program Files/Common Files/Microsoft Shared/DAO/dao350.dll') then
DAOVersion :=35
else
if fileexists('C:/Program Files/Common Files/Microsoft Shared/DAO/dao360.dll') then
DAOVersion :=36;
case DAOVersion of
35:
dao:=CreateOleObject('DAO.DBEngine.35');
36:
dao:=CreateOleObject('DAO.DBEngine.36');
else
begin
application.MessageBox('你没有安装DAO3.5/3.6,请安装ACCESS97/2000或DAO的单独运行库','提示',mb_ok+mb_iconinformation);
exit;
end;
end;
if fileexists(TargetFileName) then DeleteFile(TargetFileName); //如果目标文件已经存在则删除它
screen.Cursor:=crHourGlass;
try
dao.CompactDatabase(SourceFileName,TargetFileName);
except
application.MessageBox('压缩数据库失败'+#13+'原因:可能此数据库正在被其他程序打开。','提示',mb_ok+MB_ICONERROR);
exit;
end;
DeleteFile(SourceFileName);
RenameFile(TargetFileName,SourceFileName);
application.MessageBox('成功压缩数据库','提示',mb_ok+mb_iconinformation);
screen.Cursor:=crDefault;
end;
 
多人接受答案了。
 
顶部