如何用"代码"实现ACCESS里的"压缩与修复"的功能?(VC+ADO) ACCESS有个BUG, 数据库文件是1M,把其中的内容删除后它还是1M,不会自动缩小.ACCESS里有个功能,是"压缩与修复",只有执行它,ACCESS才能变小.我想知道如何用代码实现,VC+ADO.多谢谢了,各位大哥!@ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就算是关闭后压缩,但压缩时出这样的一个错误说,“DataBase already exists". 就是数据库已存在的意思,我不明白这是怎么回事儿! 高人解释一下这是怎么回事儿! 压缩目标不能已经存在void CPassportApp::DBCompress(LPCTSTR lpszFrom,LPCTSTR lpszTo){ if(!PathFileExists(lpszFrom)) return; if(PathFileExists(lpszTo)) { ::AfxMessageBox(IDS_COMPRESS_DEST_EXIST); return; } CString strSrcConn,strDestConn; strSrcConn.Format(IDS_COMMWITHOUTPASS,lpszFrom); strDestConn.Format(IDS_COMMWITHOUTPASS_COMPRESS,lpszTo); try { JRO::IJetEnginePtr jet(__uuidof(JRO::JetEngine)); jet->CompactDatabase( (LPCTSTR)strSrcConn, (LPCTSTR)strDestConn); ::AfxMessageBox(IDS_COMPRESS_SUCCESSFUL); } catch(_com_error &e) { ::MessageBox(NULL, (LPCTSTR)e.Description( ), "", MB_OK) ; }} 我用过一个叫FriendSafe的软件,就是用的Access,它就有在数据库打开时能"压缩"的功能.我不知道他是怎么写的.http://www.friendsafe.com/ 这位大哥,意思是不是,它先把数据库关了,然后再用“压缩”代码压缩,并且把这个压缩文件创建到其它目录,并马上再把它Copy回来,再用数据库连接它!那除了ADO外,其它方法是不是能在不关闭数据库的情况下压缩呢。谢谢! re: 这位大哥,意思是不是 ...正是re: 那除了ADO外,其它方法 ...据我所知没有 我试了这段代码,为什么刚执行到JRO::IJetEnginePtr jet(__uuidof(JRO::JetEngine));就跳到了catch里。不解! 你没装jet吧去下一个jet4.0来装 给出一个用OLE DB实现此功能的代码,各位指点!(参考了MSDN的例子),下面的代码支持对带有密码的ACCESS文件进行压缩long GetJetEngineType( LPCTSTR src );int CompactDatabase(CHTTPRequest& request, CHTTPResponse& response )//HRESULT CompactDatabase(LPCTSTR src, LPCTSTR dest){ // Initialize environment must be the first line in your function OLEINITIALIZE oleinit; LPCTSTR src; LPCTSTR dest; CComPtr<IJetCompact> spJetCompact =NULL; CComPtr<IDBCreateSession> spSession =NULL; HRESULT hr=0; ADDLOG("收到压缩命令"); CString strConnect,strTemp; CDAO_Database* pDatabase; strConnect.Format("%s\\%s\\%s%02u.mdb", InstallDirctory, DATABASE_DIR, DatabaseName, m_uPort_inc); strTemp.Format("%s\\%s\\%s%02ucmp.mdb", InstallDirctory, DATABASE_DIR, DatabaseName, m_uPort_inc); src = strConnect; dest = strTemp; //Specify the source DSO// m_pGloalDataSource.Open(CLSID_JETOLEDB_4_00, src); CDBPropSet propset1(DBPROPSET_DBINIT); propset1.AddProperty(DBPROP_INIT_DATASOURCE, dest); m_pGloalDataSource.Close(); CString m_szInitialString; m_szInitialString.Format("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=%s;Mode=Share Deny None;Extended Properties=;Jet OLEDB:System database=;Jet OLEDB:Registry Path=;Jet OLEDB:Database Password=MyPwd;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=;Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False",src); hr = m_pGloalDataSource.OpenFromInitializationString( m_szInitialString.AllocSysString()); if (FAILED(hr)) ADDLOG("打开连接失败"); long x = GetJetEngineType( src ); CDBPropSet propset2(DBPROPSET_JETOLEDB_DBINIT); propset2.AddProperty(DBPROP_JETOLEDB_ENGINE, x); CDBPropSet dbsets[2] = { propset1, propset2 }; // Have we connected to the database? ATLASSERT(m_pGloalDataSource.m_spInit != NULL); hr = m_pGloalDataSource.m_spInit->QueryInterface(IID_IDBCreateSession, (void**)&spSession); if (FAILED(hr)){ ADDLOG("查询会话接口失败"); return hr; } //IJetCompact only supported in Jet 4.0 and above hr = spSession->QueryInterface( __uuidof(IJetCompact), (void**)&spJetCompact); if (FAILED(hr)){ ADDLOG("查询压缩接口失败"); return hr; } //Delete the destination file if it exists remove(dest); //Ok compact //hr = spJetCompact->Compact(1, &propset); hr = spJetCompact->Compact(1, dbsets); if (FAILED(hr)){ ADDLOG("压缩失败"); return hr; } remove(src); rename(dest,src); return hr;}long GetJetEngineType( LPCTSTR src ){ HRESULT hr; CComBSTR bstrSource; VARIANT vPropValue; // Initialize our variant to VT_I4 and 0. vPropValue.vt = VT_I4; vPropValue.lVal = 0L; // Exit now if source database is null. if( NULL == src ) return 0; // Build connection string for source. bstrSource = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="; bstrSource += src; bstrSource += L";"; CString m_szInitialString; m_szInitialString.Format("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=%s;Mode=Share Deny None;Extended Properties=;Jet OLEDB:System database=;Jet OLEDB:Registry Path=;Jet OLEDB:Database Password=wishma;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=;Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False",src);// hr = m_pGloalDataSource.OpenFromInitializationString( m_szInitialString.AllocSysString()); hr = m_pGloalDataSource.GetProperty( DBPROPSET_JETOLEDB_DBINIT, DBPROP_JETOLEDB_ENGINE, &vPropValue ); if (FAILED(hr)) ADDLOG("获取属性失败");// Version returned will be one of these values: // // #define JETDBENGINETYPE_UNKNOWN 0x00 // #define JETDBENGINETYPE_JET10 0x01 // #define JETDBENGINETYPE_JET11 0x02 // #define JETDBENGINETYPE_JET2X 0x03 // #define JETDBENGINETYPE_JET3X 0x04 // #define JETDBENGINETYPE_JET4X 0x05 return vPropValue.lVal;} http://support.microsoft.com/default.aspx?scid=kb;EN-US;230496http://support.microsoft.com/?id=230501 引用C:\Program Files\Common Files\System\ADO\msjro.dllJRO::JetEngine->CompactDatabase(SourceConnection As String, Destconnection As String) 来晚了 各位都已经回答完毕了 1 关闭数据源2 压缩至新文件名3 之后删除源文件 新文件改为原文件名4 重新打开数据源5 完毕。说明 Access只有压缩 没有回复 那Access的"工具">"数据库实用工具">"压缩和修复数据库"之后数据库就恢复到原来的大小了 昨天群里一美女说要嫁给我,开心,散分3000以示庆祝! VC高手请进,关于Debug后的错误 如何让列表框实时显示计算结果? 请大家谈谈对文档/视图结构的认识 如何获取一个EDIT控件的状态? 请问如何在BMP图片上指定位置叠加字符 -->> 关于标题栏!!! #######更新文件的问题######## 请高手指教,我怎么能得到EXCEL中当前SHEET的最末行数和列数 怎样判断两个CString变量(注意)中一个是另一个的子集?在线等待!!! (高手救命!)线程函数的限制!谢谢!!! 关于CScrolView中的SetScrollSizes(MM_TEXT, sizeTotal)函数
void CPassportApp::DBCompress(LPCTSTR lpszFrom,LPCTSTR lpszTo)
{
if(!PathFileExists(lpszFrom)) return;
if(PathFileExists(lpszTo)) {
::AfxMessageBox(IDS_COMPRESS_DEST_EXIST);
return;
}
CString strSrcConn,strDestConn;
strSrcConn.Format(IDS_COMMWITHOUTPASS,lpszFrom);
strDestConn.Format(IDS_COMMWITHOUTPASS_COMPRESS,lpszTo);
try
{
JRO::IJetEnginePtr jet(__uuidof(JRO::JetEngine));
jet->CompactDatabase(
(LPCTSTR)strSrcConn, (LPCTSTR)strDestConn);
::AfxMessageBox(IDS_COMPRESS_SUCCESSFUL);
}
catch(_com_error &e)
{
::MessageBox(NULL, (LPCTSTR)e.Description( ), "", MB_OK) ;
}}
re: 那除了ADO外,其它方法 ...据我所知没有
就跳到了catch里。不解!
去下一个jet4.0来装
int CompactDatabase(CHTTPRequest& request, CHTTPResponse& response )
//HRESULT CompactDatabase(LPCTSTR src, LPCTSTR dest)
{
// Initialize environment must be the first line in your function
OLEINITIALIZE oleinit;
LPCTSTR src;
LPCTSTR dest;
CComPtr<IJetCompact> spJetCompact =NULL;
CComPtr<IDBCreateSession> spSession =NULL;
HRESULT hr=0;
ADDLOG("收到压缩命令");
CString strConnect,strTemp;
CDAO_Database* pDatabase;
strConnect.Format("%s\\%s\\%s%02u.mdb",
InstallDirctory, DATABASE_DIR, DatabaseName, m_uPort_inc);
strTemp.Format("%s\\%s\\%s%02ucmp.mdb",
InstallDirctory, DATABASE_DIR, DatabaseName, m_uPort_inc);
src = strConnect;
dest = strTemp;
//Specify the source DSO
// m_pGloalDataSource.Open(CLSID_JETOLEDB_4_00, src); CDBPropSet propset1(DBPROPSET_DBINIT);
propset1.AddProperty(DBPROP_INIT_DATASOURCE, dest);
m_pGloalDataSource.Close();
CString m_szInitialString;
m_szInitialString.Format("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=%s;Mode=Share Deny None;Extended Properties=;Jet OLEDB:System database=;Jet OLEDB:Registry Path=;Jet OLEDB:Database Password=MyPwd;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=;Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False",src);
hr = m_pGloalDataSource.OpenFromInitializationString( m_szInitialString.AllocSysString());
if (FAILED(hr))
ADDLOG("打开连接失败");
long x = GetJetEngineType( src );
CDBPropSet propset2(DBPROPSET_JETOLEDB_DBINIT);
propset2.AddProperty(DBPROP_JETOLEDB_ENGINE, x); CDBPropSet dbsets[2] = { propset1, propset2 }; // Have we connected to the database?
ATLASSERT(m_pGloalDataSource.m_spInit != NULL);
hr = m_pGloalDataSource.m_spInit->QueryInterface(IID_IDBCreateSession, (void**)&spSession);
if (FAILED(hr)){
ADDLOG("查询会话接口失败");
return hr;
} //IJetCompact only supported in Jet 4.0 and above
hr = spSession->QueryInterface( __uuidof(IJetCompact), (void**)&spJetCompact);
if (FAILED(hr)){
ADDLOG("查询压缩接口失败");
return hr;
} //Delete the destination file if it exists
remove(dest); //Ok compact
//hr = spJetCompact->Compact(1, &propset);
hr = spJetCompact->Compact(1, dbsets); if (FAILED(hr)){
ADDLOG("压缩失败");
return hr;
}
remove(src);
rename(dest,src);
return hr;}long GetJetEngineType( LPCTSTR src )
{
HRESULT hr;
CComBSTR bstrSource;
VARIANT vPropValue; // Initialize our variant to VT_I4 and 0.
vPropValue.vt = VT_I4;
vPropValue.lVal = 0L; // Exit now if source database is null.
if( NULL == src ) return 0; // Build connection string for source.
bstrSource = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
bstrSource += src;
bstrSource += L";";
CString m_szInitialString;
m_szInitialString.Format("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=%s;Mode=Share Deny None;Extended Properties=;Jet OLEDB:System database=;Jet OLEDB:Registry Path=;Jet OLEDB:Database Password=wishma;Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=;Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False",src);
// hr = m_pGloalDataSource.OpenFromInitializationString( m_szInitialString.AllocSysString());
hr = m_pGloalDataSource.GetProperty( DBPROPSET_JETOLEDB_DBINIT, DBPROP_JETOLEDB_ENGINE, &vPropValue );
if (FAILED(hr))
ADDLOG("获取属性失败");// Version returned will be one of these values:
//
// #define JETDBENGINETYPE_UNKNOWN 0x00
// #define JETDBENGINETYPE_JET10 0x01
// #define JETDBENGINETYPE_JET11 0x02
// #define JETDBENGINETYPE_JET2X 0x03
// #define JETDBENGINETYPE_JET3X 0x04
// #define JETDBENGINETYPE_JET4X 0x05
return vPropValue.lVal;}
http://support.microsoft.com/?id=230501
C:\Program Files\Common Files\System\ADO\msjro.dllJRO::JetEngine->CompactDatabase(SourceConnection As String, Destconnection As String)
1 关闭数据源
2 压缩至新文件名
3 之后删除源文件 新文件改为原文件名
4 重新打开数据源
5 完毕。说明 Access只有压缩 没有回复