Access,ADO& 64位

时间:2010-06-16 12:20:10

标签: ms-access ado 64-bit

我们有一个使用32位以下ADO的大型代码库,我们需要进行转换 代码为64位。我们使用的是Jet提供商,但我知道不是 在x64下受支持。我们从msado15.dll导入定义。一个沙发 以前,这个DLL的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正在找到ADO dll) 64位版本。

我相信我们安装了MDAC 2.8(我们在同一个地方有msado28.tlb 作为msado15.dll,但可能已经安装了 AccessDatabaseEngine_x64.exe)。

测试机器是Windows 7旗舰版,64位。测试代码重新编译 在该机器上使用VS2008 for x64进行完全发布并在外部运行。

然而,我们仍然得到COM错误0x800a0e7a(找不到提供者)。

是否有任何人可以建议为什么这不起作用,或者什么 进一步的测试/检查我可以执行以验证我是否拥有所有权利 机器上的东西(因此,它应该工作)?

我知道ODBC将在x64下运行(尝试使用它测试程序)但是 重写我们的ODBC代码库是不可取的!

1 个答案:

答案 0 :(得分:2)

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

其中一件事,可能还有其他事情,

尽管是office 14版本,您仍然需要使用Office 12引用作为提供者

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