Доступ, ADO и 64-бит - PullRequest
       10

Доступ, ADO и 64-бит

2 голосов
/ 16 июня 2010

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

1 Ответ

2 голосов
/ 21 января 2011
("Provider=Microsoft.ACE.OLEDB.14.0;")

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

Несмотря на то, что это версия Office 14, вам все равно нужно использовать ссылку на Office 12 для провайдера

т.е.

("Provider=Microsoft.ACE.OLEDB.12.0;")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...