2008年4月10日星期四

使用Adox取得MS Access 的table信息

1. import msadox.dll
#import "C:\Programme\Gemeinsame Dateien\System\ado\msadox.dll"

Problem:
Kompilierung läuft...
ADOBase.cpp
d:\project\dbinfo2\debug\msadox.tli(246) : error C2511: 'long __thiscall ADOX::Columns::Append(const class _variant_t &,enum ADOX::DataTypeEnum,long)' : Überladene Member-Funktion nicht in '' gefunden
d:\project\dbinfo2\debug\msadox.tli(346) : error C2556: 'enum ADOX::DataTypeEnum __thiscall ADOX::_Column::GetType(void)' : Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'enum DataTypeEnum __thiscall ADOX::_Column::Get
Type(void)'
d:\project\dbinfo2\debug\msadox.tlh(444) : Siehe Deklaration von 'GetType'
d:\project\dbinfo2\debug\msadox.tli(346) : error C2371: 'GetType' : Neudefinition; unterschiedliche Basistypen
d:\project\dbinfo2\debug\msadox.tlh(444) : Siehe Deklaration von 'GetType'
d:\project\dbinfo2\debug\msadox.tli(348) : error C2664: 'get_Type' : Konvertierung des Parameters 1 von 'enum ADOX::DataTypeEnum *' in 'enum DataTypeEnum *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
d:\project\dbinfo2\debug\msadox.tli(353) : error C2511: 'void __thiscall ADOX::_Column::PutType(enum ADOX::DataTypeEnum)' : Überladene Member-Funktion nicht in '' gefunden
Fehler beim Ausführen von cl.exe.

ADOBase.obj - 5 Fehler, 0 Warnung(en)


问题原因:
与Dao冲突定义了同名的"DataTypeEnum" and "EOF"


解决方案:
#import "C:\Programme\Gemeinsame Dateien\System\ado\msadox.dll" rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")


2. use _CatalogPtr 取得Table Information
in ADOBase.h:
#import "C:\Programme\Gemeinsame Dateien\System\ado\msadox.dll" rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")
using namespace ADOX;
ADOX::_CatalogPtr m_pCatalog;
BOOL existTable(CString sTable);


in ADOBase.cpp:
BOOL ADOBase::existTable(CString sTable)
{

try
{
m_pCatalog.CreateInstance(__uuidof(Catalog));
m_pCatalog->PutActiveConnection(_variant_t((IDispatch *) m_pConnectionSpecial));

TablesPtr m_pTables = m_pCatalog->GetTables();

_Table* m_pTable = NULL;
//m_pTables = cat->Tables->Item[sTable];

if (m_pTables->get_Item(_variant_t(sTable), &m_pTable) == S_OK)
{
return true;

}
else
return false;

}
catch (_com_error &e)
{
m_nLastError=ADOLE_OPEN_FAILED;
HandleErrorAB(e, "existTable (DB", sTable);
PROTOCOL_ENTRY(0,0,"END (_com_error) ADOBase::existTable")
return false;

}
catch(...)
{
m_nLastError=ADOLE_OPEN_FAIL_UNHANDLED;
m_sLastError = "**** Unhandled exception! **** in Open";
HandleErrorAB();
PROTOCOL_ENTRY(0,0,"END (...error) ADOBase::existTable")
return false;

}


}

没有评论: