BCB中如何来压缩 mdb 数据库

来源:互联网 发布:汇知中学在哪 编辑:程序博客网 时间:2024/05/20 18:15
数据库用的时间长了,体积会膨胀许多,删除的记录其实也没有真正被删除掉,怎样才能有效将数据库压缩呢?请各抒已见,畅所欲言。

--------------------------------------------------------------------------------

bool CompactAccessDatabase(WideString MDB, WideString Password)
{
AnsiString TMP = ExtractFilePath(MDB);
if (TMP == "")
TMP = GetCurrentDir();
TMP = TMP + AnsiString(DY_APPNAME) + "_$$$.MDB";
if (FileExists(TMP))
DeleteFile(TMP);
WideString Provider1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MDB +
";Jet OLEDB:Database Password=" + Password;
WideString Provider2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + TMP +
";Jet OLEDB:Database Password=" + Password;
Variant AdoObj = Variant::CreateObject("JRO.JetEngine");
AdoObj.OleProcedure("CompactDatabase", Provider1, Provider2);
AdoObj.Clear(); // 释放ADO对象
if (DeleteFile(MDB))
{
RenameFile(TMP, MDB);
return true;
}
return false;
}
//---------------------------------------------------------------------------

--------------------------------------------------------------------------------

不要讨论了! 快结贴!!
void __fastcall TDMod::ADODatabaseCompact()
{
if( DirectoryExists( ExtractFilePath(Application->ExeName)+"DATAS//Backup//" ) )
ForceDirectories( ExtractFilePath(Application->ExeName) + "DATAS//Backup//" );
TCOM_DBEngine Engine=new CoDBEngine->Create(); //数据整理
WideString BakMDB,SourceMDB,TargetMDB;
if(Application->MessageBox("Do you want do compress now?", "compress",MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION) == IDYES)
{
ADOConnection->Connected=false;
BakMDB = ExtractFilePath(Application->ExeName)+"DATAS//Backup//aaa.bk";
SourceMDB = DBFileName;
TargetMDB = ExtractFilePath(Application->ExeName)+"~TempTarget.dat";
if(!CopyFile(((AnsiString)SourceMDB).c_str(),((AnsiString)BakMDB).c_str(),0))
{
DeleteFile(((AnsiString)TargetMDB).c_str());
Application->MessageBox("Compress Error","compress",MB_OK);
ADOConnection->Connected=true;
return;
}
try
{
Engine->CompactDatabase(SourceMDB.c_bstr(),TargetMDB.c_bstr());//,NULL,0,NULL);
if(CopyFile(((AnsiString)TargetMDB).c_str(),((AnsiString)SourceMDB).c_str(),0))
{
DeleteFile(((AnsiString)TargetMDB).c_str());
Application->MessageBox("Successful!","compress",MB_OK+MB_ICONINFORMATION);
}
else
{
Application->MessageBox("Unsuccessful!","compress",MB_OK+MB_ICONINFORMATION);
}
}
catch(...){ShowMessage("Unsuccessful!");}
delete Engine;
}
else
delete Engine;
ADOConnection->Connected=true;
}
//----------------------------------------------------------------------------

--------------------------------------------------------------------------------

忘了说:
#include <DAO_2k.h>
#pragma link "DAO_2K"
原创粉丝点击