У нас есть большая база кода, которая использует ADO под 32-разрядной версией, и нам нужно преобразовать код в 64-разрядный. Мы использовали провайдера Jet, но я знаю, что это не поддерживается под x64. Мы импортируем определения из msado15.dll. Начиная с , ранее была доступна 64-разрядная версия этой DLL, но мы не можем , чтобы заставить ее работать.Доступ, ADO и 64-разрядный
Я написал тестовую программу следующим образом (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). У машины были данные Office Data (AccessDatabaseEngine_x64.exe), применяемые для получения новых драйверов ACE (ACEODBC.DLL, v14.nnn.nnn.nnn). Если я смотрю на источник данных в разделе «Администратор» «Инструменты» (я знаю, что ODBC - это не то же самое, что ADO, это просто подтверждение, что DLL была установлена ), она отображает ожидаемую DLL.
Я даже могу подтвердить, используя Process Explorer, что версия msado15.dll загружает во время выполнения (тем самым подтверждая, что COM находит DLL ADO) является 64-разрядная версия.
Я считаю, что у нас есть MDAC 2.8 установлен (мы msado28.tlb в том же месте как msado15.dll, но это, возможно, были установлены AccessDatabaseEngine_x64.exe).
Тест-машина Windows 7 Ultimate, 64-бит. Код теста был перекомпилирован на этой машине с использованием VS2008 для x64 в полном объеме. Выпуск и запуск извне.
И все же мы все еще получаем ошибку COM 0x800a0e7a (поставщик не найден).
Есть ли что-нибудь может предложить, почему это не работает, или какие дополнительные тесты/проверки можно выполнить, чтобы убедиться, что у меня есть все вещи прямо на машине (и, таким образом, что это должен работы)?
Я знаю, что ODBC будет работать под x64 (попробовал бы тестовую программу, используя это), но переписывание нашей базы кода для ODBC было бы нежелательным!
Are вы уверены, что 64-битные компоненты зарегистрированы правильно? –
К сожалению, я не могу сказать. Я нашел каталог с тузом *.dll, но regsvr32 не работает на них. Они могут быть объединенными сборками, не помнят, как их перерегистрировать. Я заглянул в реестр и могу найти HKLM \ Software \ Microsoft \ Office \ 14.0 \ и группу ключей и подразделов, в том числе «Access Connectivity Engine», но неясно, какие, если таковые имеются, реализуют ADO. Я могу только предположить, что тот факт, что эти ключи существуют, и источники данных ODBC упоминают те библиотеки DLL в списке драйверов исходных данных, что они * * зарегистрированы. – JTeagle
Есть ли regsvr64? –