急迫和真诚的请教大侠们一个问题:在delphi中如何解决access数据库自动膨胀的问题?

时间:2023-01-09 21:40:11
我在用delhpi编程的过程中发现每运行一次程序access数据库就会自动膨胀一些,但这时并没有向数据库中添加数据,在access中可以手工解决这一问题,但如何在程序中解决这一问题呢?敬请大侠们不吝赐教!

8 个解决方案

#1


>>在access中可以手工解决这一问题
????

運行一段時間, 就壓縮一次數據庫了

#2


在access中是可以手工解决,但在程序中如何实现呢?运行一段时间后也不会自己压缩阿!

#3


运行一段时间,压缩一下,或退出时候自动压缩。

function TForm1.CompactDatabase(AFileName: string): boolean;
const
  SConnectionString =
    'Provider=Microsoft.Jet.OLEDB.4.0;Password=XXXXXX;' +
    'User ID=XXXXXX;' +
    'Data Source=%S;' 
var
  SPath, SFile: array[0..254] of Char;
  STempFileName: string;
  JE: OleVariant;
begin
  GetTempPath(40, SPath); //取得Windows的Temp路径
  GetTempFileName(SPath, '~CP', 0, SFile); //取得Temp文件名,Windows将自动建立0字节文件
  STempFileName := SFile; //PChar->String
  DeleteFile(STempFileName); //删除Windows建立的0字节文件
  try
    JE := CreateOleObject('JRO.JetEngine'); //建立OLE对象,函数结束OLE对象超过作用域自动释放
    OleCheck(JE.CompactDatabase(Format(SConnectionString, [AFileName1]), format(SConnectionString, [STempFileName, AFileName1]))); //压缩数据库
    //复制并覆盖源数据库文件,如果复制失败则函数返回假,压缩成功但没有达到函数的功能
    result := CopyFile(PChar(STempFileName), PChar(AFileName), false);
    DeleteFile(STempFileName); //删除临时文件
  except
    result := false; //压缩失败
  end;
end;
  

#4


AFileName是要压缩的数据库文件名

#5


function CompactDatabase(AFileName,APassWord:string):boolean;
var
 STempFileName:string;
 vJE:OleVariant;
begin
 STempFileName:=GetTempPathFileName;
 try
   vJE:=CreateOleObject('JRO.JetEngine');
   vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
       format(SConnectionString,[STempFileName,APassWord]));
   result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
   DeleteFile(STempFileName);
 except
   result:=false;
 end;
end;

#6


测试通过

use Variants,ComObj;
...
procedure TForm1.Button1Click(Sender: TObject);
var
 dao:OLEVariant;
begin
  adoconnection1.Close;//压缩是以独占方式进行的;压缩前要关闭数据库连接。
  screen.Cursor:=crHourGlass;
  dao:=CreateOleObject('DAO.DBEngine.36');//access2000要用dao3.6,在access97上用35和36都可以
  dao.CompactDatabase('TestDB1.mdb','temp.mdb');
  DeleteFile('TestDB1.mdb');
  RenameFile('temp.mdb','TestDB1.mdb');
  adoconnection1.Open;
  screen.Cursor:=crDefault;
  Showmessage('本地数据库压缩完成');
end;

#7


请问miky大侠:我在刚才运行了您给的那个函数,系统提示:Undeclared identifier'CreateOleObject'和Undeclared identifier'OleCheck'这是怎么回事呢?

#8


谢谢诸位大侠,尤其是samcrm,我的问题解决了,用的是samcrm大虾提供的程序,现在结帖!

#1


>>在access中可以手工解决这一问题
????

運行一段時間, 就壓縮一次數據庫了

#2


在access中是可以手工解决,但在程序中如何实现呢?运行一段时间后也不会自己压缩阿!

#3


运行一段时间,压缩一下,或退出时候自动压缩。

function TForm1.CompactDatabase(AFileName: string): boolean;
const
  SConnectionString =
    'Provider=Microsoft.Jet.OLEDB.4.0;Password=XXXXXX;' +
    'User ID=XXXXXX;' +
    'Data Source=%S;' 
var
  SPath, SFile: array[0..254] of Char;
  STempFileName: string;
  JE: OleVariant;
begin
  GetTempPath(40, SPath); //取得Windows的Temp路径
  GetTempFileName(SPath, '~CP', 0, SFile); //取得Temp文件名,Windows将自动建立0字节文件
  STempFileName := SFile; //PChar->String
  DeleteFile(STempFileName); //删除Windows建立的0字节文件
  try
    JE := CreateOleObject('JRO.JetEngine'); //建立OLE对象,函数结束OLE对象超过作用域自动释放
    OleCheck(JE.CompactDatabase(Format(SConnectionString, [AFileName1]), format(SConnectionString, [STempFileName, AFileName1]))); //压缩数据库
    //复制并覆盖源数据库文件,如果复制失败则函数返回假,压缩成功但没有达到函数的功能
    result := CopyFile(PChar(STempFileName), PChar(AFileName), false);
    DeleteFile(STempFileName); //删除临时文件
  except
    result := false; //压缩失败
  end;
end;
  

#4


AFileName是要压缩的数据库文件名

#5


function CompactDatabase(AFileName,APassWord:string):boolean;
var
 STempFileName:string;
 vJE:OleVariant;
begin
 STempFileName:=GetTempPathFileName;
 try
   vJE:=CreateOleObject('JRO.JetEngine');
   vJE.CompactDatabase(format(SConnectionString,[AFileName,APassWord]),
       format(SConnectionString,[STempFileName,APassWord]));
   result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
   DeleteFile(STempFileName);
 except
   result:=false;
 end;
end;

#6


测试通过

use Variants,ComObj;
...
procedure TForm1.Button1Click(Sender: TObject);
var
 dao:OLEVariant;
begin
  adoconnection1.Close;//压缩是以独占方式进行的;压缩前要关闭数据库连接。
  screen.Cursor:=crHourGlass;
  dao:=CreateOleObject('DAO.DBEngine.36');//access2000要用dao3.6,在access97上用35和36都可以
  dao.CompactDatabase('TestDB1.mdb','temp.mdb');
  DeleteFile('TestDB1.mdb');
  RenameFile('temp.mdb','TestDB1.mdb');
  adoconnection1.Open;
  screen.Cursor:=crDefault;
  Showmessage('本地数据库压缩完成');
end;

#7


请问miky大侠:我在刚才运行了您给的那个函数,系统提示:Undeclared identifier'CreateOleObject'和Undeclared identifier'OleCheck'这是怎么回事呢?

#8


谢谢诸位大侠,尤其是samcrm,我的问题解决了,用的是samcrm大虾提供的程序,现在结帖!