湖南高速路况咨询电话:ACCESS数据库存储大批量采集信息的问题

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 02:56:43

由于工作需要,使用ACCESS数据库存储港口周围AIS设备接收到的船舶数据。由于在全国很多港口有采集点,因此,数据量很大,每三分钟存储一次数据的话,那么一次将有2000多新的船位数据。这些数据入库后,数据库文件大小将新增1M到2M左右。根据这个频率,一个小时数据库文件将增加40M,一天就是960M。

为了提高数据库效率,我对数据库中存储的船舶数据进行定时删除,最多保留30万条记录。但是ACCESS中执行delete后,并没有在空间上减少,而只是减少了表中的数据量,这样,就达不到数据库文件变小的要求。

为了解决这个问题,从网上找到了通过写代码实现数据库文件压缩的代码。通过压缩可以释放delete后占用的空间。

实际的代码如下:

============================================

BOOL CPetrelProView::CompactDatabase()
{
 WriteLog("===开始数据库压缩===","COMPDB");
 //::CoInitialize(NULL);   
 CString sDBFilePathName = GetModulePath() + "ShipSurvey.mdb";//数据库文件
 CString sDstDBFilePathName = GetModulePath() + "ShipSurvey_back.mdb";//临时文件
 try
 {
  ::DeleteFile(sDstDBFilePathName);//删除已有的临时文件
  CFile::Rename(sDBFilePathName,sDstDBFilePathName);//将当前库文件改名为临时文件
 }
 catch(...)
 {
  WriteLog("文件改名失败。","COMPDB");
  return FALSE;
 }

 IJetEnginePtr jet(__uuidof(JetEngine));
 BOOL bOK = TRUE;
 try
 {
  //压缩临时文件为当前文件
  CString sSrc;
  sSrc.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database Password=",sDstDBFilePathName);
  CString sDst;
  sDst.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Password=",sDBFilePathName);
  long lResult = jet->CompactDatabase(_bstr_t(sSrc),_bstr_t(sDst));
  jet.Release();   
  //::CoUninitialize();  
  if(lResult == S_OK)
  {
   WriteLog("数据库压缩完成。","COMPDB");
   WIN32_FILE_ATTRIBUTE_DATA fad; 
   GetFileAttributesEx(sDBFilePathName,GetFileExInfoStandard,&fad);
   CString sDBSize;
   sDBSize.Format("压缩后数据库大小:%.1fM",fad.nFileSizeLow/1048576.0);
   WriteLog(sDBSize,"COMPDB");
  }
  else
  {
   WriteLog("数据库压缩失败。","COMPDB");
   CFile::Rename(sDstDBFilePathName,sDBFilePathName);//将临时文件改名为当前库文件
   bOK = FALSE;
  }
 }
 catch(_com_error &e) 
 {       
  //::CoUninitialize();  
  WriteLog((LPCTSTR)e.Description(),"COMPDB");
  WriteLog("数据库压缩异常。","COMPDB");
  CFile::Rename(sDstDBFilePathName,sDBFilePathName);//将临时文件改名为当前库文件
  bOK = FALSE;
 }
 catch(...)
 {
  WriteLog("数据库压缩异常。","COMPDB");
  CFile::Rename(sDstDBFilePathName,sDBFilePathName);//将临时文件改名为当前库文件
  bOK = FALSE;
 }
 WriteLog("===完成数据库压缩===","COMPDB");
 return bOK;
}

========================================================

由于数据库文件压缩必须将文件压缩成备份文件,不能对一个文件直接压缩。因此先将需要压缩的文件改名,然后压缩成原文件名。这样,一个500M左右的数据库文件,只需要几秒钟就可以压缩完成了。

但是当数据库文件压缩完成后,再次连接数据库进行数据插入等操作后,数据库文件将急速增大。这个过程应该是数据库在恢复一些之前被压缩掉的库辅助信息,如果打开VC工程会产生一些辅助文件一样。