2010-06-16 1 views
2

У нас есть большая база кода, которая использует 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 было бы нежелательным!

+0

Are вы уверены, что 64-битные компоненты зарегистрированы правильно? –

+0

К сожалению, я не могу сказать. Я нашел каталог с тузом *.dll, но regsvr32 не работает на них. Они могут быть объединенными сборками, не помнят, как их перерегистрировать. Я заглянул в реестр и могу найти HKLM \ Software \ Microsoft \ Office \ 14.0 \ и группу ключей и подразделов, в том числе «Access Connectivity Engine», но неясно, какие, если таковые имеются, реализуют ADO. Я могу только предположить, что тот факт, что эти ключи существуют, и источники данных ODBC упоминают те библиотеки DLL в списке драйверов исходных данных, что они * * зарегистрированы. – JTeagle

+0

Есть ли regsvr64? –

ответ

2
("Provider=Microsoft.ACE.OLEDB.14.0;") 

Одна из вещей, могут быть и другие,

Несмотря на то, офис 14 версии вы по-прежнему необходимо использовать ссылку Office 12 для поставщика

т.е.

("Provider=Microsoft.ACE.OLEDB.12.0;")