分类: C/C++
2008-08-01 17:08:48
#include上面使用了ADOX接口和智能指针的方法,如果你使用#import指令来引入ADOX库那么就更方便了。#include #include #include #pragma comment(lib, "comsupp.lib") #pragma comment(lib, "shlwapi.lib") CComPtr Catalog; HRESULT hr = Catalog.CoCreateInstance(L"ADOX.Catalog"); if (FAILED(hr)) { throw _com_error(hr, NULL); } static const TCHAR szConnStr[] = _T("Provider=Microsoft.Jet.OLEDB.4.0;") _T("Data Source=C:\\TEST1.MDB;"); CComVariant varConn; hr = Catalog->Create(CComBSTR(szConnStr), &varConn); if (FAILED(hr)) { throw _com_error(hr, NULL); }
#import "c:\program files\common files\system\ado\msadox.dll" using namespace ADOX; _CatalogPtr pCatalog; pCatalog.CreateInstance(__uuidof(Catalog)); pCatalog->Create(CComBSTR(szConnStr));得到了Catalog对象就可以操作它里面的子对象(Groups, Procedures, Tables, Views, Users)等,例如要检查某个表是否已经存在 :
TablesPtr pTables = pCatalog->GetTables(); _Table* pTable = NULL; if (pTables->get_Item(CComVariant(_T("Table Name")), &pTable) == S_OK) { // OK 指定的表存在。 }使用智能指针的方法同理。
CComPtrTables = NULL; Catalog->get_Tables(&Tables); CComPtr Table = NULL; Tables->get_Item(CComVariant(_T("Table Name")), &Table);
#includeJet OLEDB:Engine Type=5表示使用MS JET 4x版本的MDB文件,如果没有给出本属性则系统自动将压缩后的MDB文件转换为当前最新的版本。static const TCHAR szSrc[] = _T("Provider=Microsoft.Jet.OLEDB.4.0;") _T("Data Source=C:\\TEST1.MDB;"); //_T("Jet OLEDB:Engine Type=5;Jet OLEDB:Database Password=???"); static const TCHAR szDst[] = _T("Provider=Microsoft.Jet.OLEDB.4.0;") _T("Data Source=C:\\TEST2.MDB;"); //_T("Jet OLEDB:Engine Type=5;Jet OLEDB:Database Password=???");
CComPtrMS的文档指出自MDAC2.6开始便不再包含JET组件,而MDAC2.7是JRO的最后一个版本,而且JRO不能在WIN64上使用。看样子是M$怂恿我们用SQL SERVER了。 下载本文示例代码Engine; // if (SUCCEEDED(Engine.CoCreateInstance(__uuidof(JetEngine)))) if (SUCCEEDED(Engine.CoCreateInstance(L"JRO.JetEngine"))) { Engine->CompactDatabase(CComBSTR(szSrc), CComBSTR(szDst)); }