怎么压缩access数据库(100分)

  • 主题发起人 主题发起人 stjsq
  • 开始时间 开始时间
S

stjsq

Unregistered / Unconfirmed
GUEST, unregistred user!
做了个数据库,有20个字段左右,才366个记录居然有6m多空间,
哇塞,请问怎么压缩这个数据库。
 
你不会存的是图片或大型备注数据吧,压缩的话,在Access2000,
在菜单“工具”的“数据库实用工具”项有“压缩和修复数据库”,
试试吧,我不经常用!
 
看看http://www.delphibbs.com/delphibbs/DispQ.asp?LID=396655
多看看以前的问题,可以节省积分的
 
看下diamond access 有demo压缩修复 access 库的
 
我不想用diamond的控件,请问是否有其他方法,谢谢
 
在access97也有“压缩和修复数据库”的工具;
也可以在delphi里用函数做,不过压缩函数我不太记得了,曾在哪里看过,不好意思;
不用程序写的话,就用access的工具嘛。
 
呵呵,我希望是在delphi里面用语句实现的。
 
Shrink在sql server7中可以
 
呵呵,tyrael提到的那个问题有答案,去看看吧,是compactDatabase吧
 
to tyrael:在哪里?不过compatdatabase对access好象不起作用。
 
你可一看看/ocx/servers/access97.pas
_application.dbenginee对象
compatdatabas就是他的一个方法
至于如何使用,和一般的com对象使用是一样的
应该懂了把
 
动态创建、压缩Access数据库(*.MDB)
一、通过OLE方式创建
相信各位都用通过OLE方式访问Word、Excel文件的经历,具体我不说太多,直接把具体代码写出来就完了
在引用部分加入:
uses ComObj;
实现部分:
procedure TFormOffice.BitBtn1Click(Sender: TObject);
var
CreateAccess:OleVariant;
begin
CreateAccess:=CreateOleObject('ADOX.Catalog');
CreateAccess.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/Aceco.mdb');
end;

说明:
1、在C:/下创建Aceco.mdb;
2、是Access2000格式,用Access97打不开;
3、系统需安装MDAC,这是好消息,客户不需安装Access也可以

二、通过DBEngine创建
这才是关键中的关键,是我一定要写出来的原因!
各位是否还记得安装Delphi的时候,如果你选择自定义安装(我一般用Delphi写控件,所以当然是越小越好),会有很多安装选项,让你选择Access97或Access2000,还有MDAC等,问题就在这里!Delphi5.0中早就封装了现成的类,只是大家都没有注意而已它位于:
$Delphi5/Imports
目录下!
其中有DAO97.DCU文件,它是通过DAO350.DLL来完成的,其中的定义部分和DAO350.DLL如出一辙!OK,到现在,所有的一切都明白了(可惜我花了一天时间!)。那么具体实现起来就太方便了,具体过程如下:
在引用部分加入:
uses DAO97;
实现部分:
procedure TFormOffice.BitBtn4Click(Sender: TObject);
var
Engine:DBEngine;
begin
Engine:=CoDBEngine.Create;
Engine.CreateDatabase('c:/NewAccess.mdb',';LANGID=0x0804;CP=936;COUNTRY=0;',dbEncrypt);
end;

说明:
1、在C:/下创建NewAccess.mdb;
2、语言国家是简体中文;
3、压缩整理数据库用Engine.CompactDatabase('c:/invoice.mdb','c:/God.mdb','',0,'');就是将c:/invoice.mdb压缩整理成c:/God.mdb,剩下的只是将c:/invoice.mdb删除(DeleteFile('c:/invoice.mdb');),然后将c:/God.mdb重新命名(RenameFile('c:/God.mdb','c:/invoice.mdb');)即可。
 
Access里有自带的.
 
同意房客的
 
diamond access 好象不能做报表数据源?谁有成功经验?
 
我在borland newgroup上看到有用JRO的,后面是例子;
还有OLE DB Provider for Microsoft Jet 中提供了一个interface IJetCompact,但不知道如何在delphi中调用?
IJetCompact::Compact
Compacts or repairs a database, creating a new database. The old database is retained unchanged.

Syntax
HRESULT IJetCompact::Compact(
ULONG cPropertySets,
DBPROPSET rgPropertySets[]);
Parameters
cPropertySets
[in]
The number of DBPROPSET structures in rgPropertySets. If this is zero,
the provider ignores rgPropertySets and the method does nothing.
rgPropertySets
[in/out]
An array of DBPROPSET structures containing properties and values to be set.
If the data source object or enumerator is uninitialized, the properties
specified in these structures must belong to the Initialization property group.
If the data source object is initialized, the properties must belong to the
Data Source property group. If the enumerator is initialized, it is an error
to call this method. If the same property is specified more than once in
rgPropertySets, the value used is provider-specific. If cPropertySets is zero,
this parameter is ignored
JRO压缩access的例子;
Here's a procedure that works for me. You have to import the JRO type
library to compact an Access database.

procedure TMainForm.CompactDataBaseMenuClick(Sender: TObject);
var JROJetEngine: TJROJetEngine;
strTempDBPath,
strSource,
strDest,
strJetVersion: string;
iLength: integer;
begin
if strGlobalAccessVersion = '2000' then
strJetVersion := '5' { Access 2000}
else if strGlobalAccessVersion = '97' then
strJetVersion := '4'; {Jet 3.x, Access 97}
strTempDBPath := ExtractFilePath(strGlobalDBPath) + 'TEMP.MDB';
strSource := 'Data Source=' + strGlobalDBPath + ';Jet OLEDB:Engine Type='
+ strJetVersion;
strDest := 'Data Source=' + strTempDBPath + ';Jet OLEDB:Engine Type=' +
strJetVersion;
try
try
Screen.Cursor := crHourGlass;
if not dbModule.CloseAll then
begin
MessageDlg('Error closing some datasets, unable to compact',
mtError, [mbOk], 0);
exit;
end
else
dbModule.ADOConnection1.Close;
Application.ProcessMessages;
JROJetEngine := TJROJetEngine.Create(Application);
JROJetEngine.CompactDatabase(strSource, strDest);
SysUtils.DeleteFile(strGlobalDBPath);
RenameFile(strTempDBPath, strGlobalDBPath);
MessageDlg('The database has been packed', mtInformation, [mbOk], 0);
except
on E: Exception do
MessageDlg('Error packing database: ' + E.Message, mtError, [mbOk],0);
end;
finally
JROJetEngine.Free;
dbModule.ADOConnection1.Open;
Screen.Cursor := crDefault;
end;
end;
 
原来的答案太复杂,这个是标准答案之一,最简单,分全给我 ;-)
use ComObj;
procedure Tmainform.Button1Click(Sender: TObject);
var dao:OLEVariant;
begin
adoconnection1.Close;//压缩是以独占方式进行的;压缩前要关闭数据库连接。
screen.Cursor:=crHourGlass;
dao:=CreateOleObject('DAO.DBEngine.35');//'DAO.DBEngine.36'也可以,不知道是不是access2000要用dao3.6,我在access97上用35和36都可以
dao.CompactDatabase('原来的数据库.mdb','临时数据库.mdb');
DeleteFile('原来的数据库.mdb');
RenameFile('临时数据库.mdb','原来的数据库.mdb');
adoconnection1.Open;
adotable1.Active:=true;
screen.Cursor:=crDefault;
end;
 
多人接受答案了。
 
后退
顶部