ACCESS数据库存储大批量采集信息的问题

针对大量船舶数据存储导致ACCESS数据库膨胀的问题,通过定时删除记录并采用特定代码进行数据库压缩,以减少文件大小并提高效率。但发现压缩后数据库在后续使用中会迅速增大。

由于工作需要,使用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工程会产生一些辅助文件一样。

货运作业  货运作业总单  托运明细记录查询  物流统计  进仓单  出仓单  仓库记录 作业查询  库存记录  委托单位  经营单位  托运记录  车辆托运查询  托运明细记录查询 财务结算  货运作业结算总单  结算分单  费用统计表  仓库结算单  结算总单  结算单位查询  结算总目录  托运记录查询  所属车队车辆查询  报价 系统维护  公司资料设置  操作人员权限设置  更改密码  物流方式设置  委托单位设置  经营单位设置  到港名称设置  仓库名称设置  车辆资料管理  客户明细资料设置  传真 系统服务  备份数据  恢复数据  导出数据  导入数据 货运物流管理系统(主菜单结构)├─货运作业│  ├─货运作业总单│  ├─托运明细记录查询│  ├─物流统计│  ├─进仓单│  ├─出仓单│  └─仓库记录├─作业查询│  ├─库存记录│  ├─委托单位│  ├─经营单位│  ├─托运记录│  ├─车辆托运查询│  └─托运明细记录查询├─财务结算│  ├─货运作业结算总单│  ├─结算分单│  ├─费用统计表│  ├─仓库结算单│  ├─结算总单│  ├─结算单位查询│  ├─结算总目录│  ├─托运记录查询│  ├─所属车队车辆查询│  └─报价├─系统维护│  ├─公司资料设置│  ├─操作人员权限设置│  ├─更改密码│  ├─物流方式设置│  ├─委托单位设置│  ├─经营单位设置│  ├─到港名称设置│  ├─仓库名称设置│  ├─车辆资料管理│  ├─客户明细资料设置│  └─传真└─系统服务   ├─备份数据   ├─恢复数据   ├─导出数据   └─导入数据  货运作业总单  ZY110托运明细记录查询  ZY120物流统计  ZY130进仓单  ZY210出仓单  ZY220仓库记录  ZY310库存记录  CX110委托单位  CX120经营单位  CX210托运记录  CX220车辆托运查询  CX310托运明细记录查询  CX320货运作业结算总单  JS110结算分单  JS210费用统计表  JS220仓库结算单  JS230结算总单  JS240结算单位查询  JS310结算总目录  JS320托运记录查询  JS410所属车队车辆查询  JS420报价  JS510公司资料设置  WH110操作人员权限设置  WH120更改密码  WH210物流方式设置  WH310委托单位设置  WH320经营单位设置  WH330到港名称设置  WH340仓库名称设置  WH350车辆资料管理  WH360客户明细资料设置  WH410传真  WH420备份数据  FW110恢复数据  FW120导出数据  FW210导入数据  FW220关于……  Help110  货运作业、作业查询、财务结算、系统维护、系统服务 货运作业货运作业总单、托运明细记录查询、物流统计、进仓单、出仓单、仓库记录 作业查询库存记录、委托单位、经营单位、托运记录、车辆托运查询、托运明细记录查询 财务结算货运作业结算总单、结算分单、费用统计表、仓库结算单、结算总单、结算单位查询、结算总目录、托运记录查询、所属车队车辆查询、报价 系统维护公司资料设置、操作人员权限设置、更改密码、物流方式设置、委托单位设置、经营单位设置、到港名称设置、仓库名称设置、车辆资料管理、客户明细资料设置、传真 系统服务备份数据、恢复数据、导出数据、导入数据
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值