ACCESS有个BUG, 数据库文件是1M,把其中的内容删除后它还是1M,不会自动缩小.ACCESS里有个功能,是"压缩与修复",只有执行它,ACCESS才能变小.我想知道如何用代码实现,VC+ADO.多谢谢了,各位大哥!@

解决方案 »

  1.   

    就算是关闭后压缩,但压缩时出这样的一个错误说,“DataBase already exists". 就是数据库已存在的意思,我不明白这是怎么回事儿! 高人解释一下这是怎么回事儿!
      

  2.   

    压缩目标不能已经存在
    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) ;    
    }}
      

  3.   

    我用过一个叫FriendSafe的软件,就是用的Access,它就有在数据库打开时能"压缩"的功能.我不知道他是怎么写的.http://www.friendsafe.com/
      

  4.   

    这位大哥,意思是不是,它先把数据库关了,然后再用“压缩”代码压缩,并且把这个压缩文件创建到其它目录,并马上再把它Copy回来,再用数据库连接它!那除了ADO外,其它方法是不是能在不关闭数据库的情况下压缩呢。谢谢!
      

  5.   

    re: 这位大哥,意思是不是 ...正是
    re: 那除了ADO外,其它方法 ...据我所知没有
      

  6.   

    我试了这段代码,为什么刚执行到JRO::IJetEnginePtr jet(__uuidof(JRO::JetEngine));
    就跳到了catch里。不解!
      

  7.   

    你没装jet吧
    去下一个jet4.0来装
      

  8.   

    给出一个用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;}
     
      

  9.   

    http://support.microsoft.com/default.aspx?scid=kb;EN-US;230496
    http://support.microsoft.com/?id=230501
      

  10.   

    引用
    C:\Program Files\Common Files\System\ADO\msjro.dllJRO::JetEngine->CompactDatabase(SourceConnection As String, Destconnection As String)
      

  11.   

    来晚了 各位都已经回答完毕了 
    1 关闭数据源
    2 压缩至新文件名
    3 之后删除源文件 新文件改为原文件名
    4 重新打开数据源
    5 完毕。说明 Access只有压缩 没有回复
      

  12.   

    那Access的"工具">"数据库实用工具">"压缩和修复数据库"之后数据库就恢复到原来的大小了