У нас есть большая кодовая база, которая использует ADO под 32-битными, и нам нужно преобразовать
код до 64-битный. Мы использовали провайдера Jet, но я знаю, что это не
поддерживается под x64. Мы импортируем определения из msado15.dll. Диван
некоторое время назад стала доступна 64-битная версия этой DLL, но мы не можем
чтобы заставить его работать.
Я написал тестовую программу следующим образом (MFC, используя #imported DLL):
map<CString, CString> mapResults ;
_ConnectionPtr pConn = NULL ;
CString strConn = _T("Provider=Microsoft.ACE.OLEDB.14.0;")
_T("Data Source=c:\\program files\\our_company\\our_database.mdb;");
// (Above string only split for readability here.)
CString strSQL = _T("SELECT * FROM [our_table] ORDER BY [our_field_1];");
try
{
pConn.CreateInstance(__uuidof(Connection) );
pConn->Open(_bstr_t(strConn), _bstr_t(_T("") ), _bstr_t(_T("") ), -1);
_CommandPtr pCommand = NULL;
pCommand.CreateInstance(__uuidof(Command) );
pCommand->CommandType = adCmdText ;
pCommand->ActiveConnection = pConn ;
pCommand->CommandText = _bstr_t(strSQL);
_RecordsetPtr pRS = NULL ;
pRS.CreateInstance(__uuidof(Recordset) );
pRS->CursorLocation = adUseClient ;
pRS = pCommand->Execute(NULL, NULL, adCmdText);
while (pRS->adoEOF != VARIANT_TRUE)
{
CString strField = (LPCTSTR)(_bstr_t)pRS->Fields->GetItem(
(_bstr_t)_T("our_field_1") )->Value ;
CString strValue = (LPCTSTR)(_bstr_t)pRS->Fields->GetItem(
(_bstr_t)_T("our_field_2") )->Value ;
mapResults[strField] = strValue ;
pRS->MoveNext();
}
}
catch(_com_error &e)
{
CString strError ;
strError.Format(_T("Error %08x: %s"),(int)e.Error(),
e.ErrorMessage() );
mapResults[_T("COM error") ] = strError ;
}
По сути, код выведет список таблицы, если она будет выполнена успешно, или список COM.
ошибка, полученная в случае сбоя. Очевидно, мы протестировали код под 32-битным и
получил желаемые результаты.
На 64-битной машине код явно импортируется из известного 64-битного
версия msado15.dll (v6.1.7600.nnn). У машины были офисные данные
Поставщики (AccessDatabaseEngine_x64.exe), применяемые для получения новых драйверов ACE
(ACEODBC.DLL, v14.nnn.nnn.nnn). Если я смотрю на источник данных под администратором
Инструменты (я знаю, что ODBC - это не то же самое, что ADO, я просто подтвердил, что DLL
установлен правильно), он показывает ожидаемую DLL.
Я даже могу подтвердить, используя Process Explorer, что версия msado15.dll
он загружается во время выполнения (таким образом подтверждая, что COM находит ADO DLL)
64-битная версия.
Я считаю, что у нас установлен MDAC 2.8 (у нас msado28.tlb в том же месте
как msado15.dll, но это может быть установлено
AccessDatabaseEngine_x64.exe).
Тестовый компьютер - Windows 7 Ultimate, 64-разрядный. Тестовый код был перекомпилирован
на этом компьютере с полной версией VS2008 для x64 и внешним запуском.
И все же мы все еще получаем ошибку COM 0x800a0e7a (поставщик не найден).
Есть ли что-нибудь, что кто-либо может предложить относительно того, почему это не работает, или что
дальнейшие тесты / проверки я могу выполнить, чтобы убедиться, что у меня есть все права
вещи на машине (и, таким образом, что она должна работать)?
Я знаю, что ODBC будет работать под x64 (попробовал тестовую программу, используя это), но
переписывать нашу кодовую базу для ODBC было бы нежелательно!