我需要在VC 中使用ADO对于ACCESS数据库进行压缩,网上主要介绍的都是采用ADO控件或JRO在VB中使用,那位能够指点在下如何在vc中实现(不使用控件)。

解决方案 »

  1.   

    ADO不能压缩ACCESS数据库吧,至少没见过,但用DAO可以实现,不妨试试
      

  2.   

    要不就直接调用 winrar 来压缩
    压缩率比 jro 多的多
      

  3.   

    是否能提供JRO在VC中的代码?
      

  4.   

    ADO压缩access数据库:1.头文件加一行:
    #import "C:\PROGRAM FILES\COMMON FILES\System\ado\MSJRO.DLL" no_namespace 2.代码:
    ...
    try
    {
       IJetEnginePtr jet(__uuidof(JetEngine));
       jet->CompactDatabase(
             "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\nwind2.mdb", 
             "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\abbc.mdb;" \ 
             "Jet OLEDB:Engine Type=4");
    }
    catch(_com_error &e) 
    {       
       ::MessageBox(NULL, (LPCTSTR)e.Description( ), "", MB_OK) ;    
    }

    3:其中
    Jet OLEDB:Engine Type 的值的含义:
    1: JET10
    2: JET11 
    3: JET2X
    4: JET3X
    5: JET4XOLE DB压缩access数据库代码:#include <objbase.h>#define DBINITCONSTANTS
    #define INITGUID#include <initguid.h>
    #include <oledb.h>
    #include "msjetoledb.h"
    #include "jetoledb.h" // for IJetCompact interface
    #include <atldbcli.h>long GetJetEngineType( LPCTSTR src );class OLEINITIALIZE
    {
    bool m_bOleInit;
    public:
    OLEINITIALIZE()
    {
    m_bOleInit= (CoInitialize(NULL)==S_OK); }
    ~OLEINITIALIZE()
    {
    if (m_bOleInit)
    CoUninitialize();
    }
    };HRESULT CompactDatabase(LPCTSTR src, LPCTSTR dest)
    {
    // Initialize environment must be the first line in your function
    OLEINITIALIZE oleinit; CDataSource ds;
    CComPtr<IJetCompact> spJetCompact =NULL;
    CComPtr<IDBCreateSession> spSession =NULL;
    HRESULT hr=0; //Specify the source DSO
    ds.Open(CLSID_JETOLEDB_4_00, src); CDBPropSet propset1(DBPROPSET_DBINIT);
            propset1.AddProperty(DBPROP_INIT_DATASOURCE, dest); 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(ds.m_spInit != NULL);
    hr = ds.m_spInit->QueryInterface(IID_IDBCreateSession, (void**)&spSession);
    if (FAILED(hr))
    return hr; //IJetCompact only supported in Jet 4.0 and above
    hr = spSession->QueryInterface( __uuidof(IJetCompact), (void**)&spJetCompact);
    if (FAILED(hr))
    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))
    return hr;

    return hr;}long GetJetEngineType( LPCTSTR src )
    {
    HRESULT hr;
    CDataSource ds;
    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";"; hr = ds.OpenFromInitializationString( bstrSource );
    hr = ds.GetProperty( DBPROPSET_JETOLEDB_DBINIT, DBPROP_JETOLEDB_ENGINE, &vPropValue );<BR/>
    <BR/>
    // 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;}