2010-06-16 47 views
2

我们有一个使用32位以下的ADO的大型代码库,我们需要将 代码转换为64位。我们正在使用Jet提供程序,但我知道这不是支持在x64下的 。我们正在从msado15.dll导入定义。从前一个 开始,此DLL的64位版本变得可用,但我们无法使用 来使其运行。访问,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位机器上,代码明确地从msado15.dll(v6.1.7600.nnn)的已知64位版本 导入。该机器已应用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代码库将不受欢迎!

+0

是Office 12参考你确定64位组件已正确注册? – 2010-06-16 20:45:22

+0

不幸的是我不能说。我已经找到了ace *的目录。dll文件,但regsvr32不起作用。他们可能是互操作程序集,不记得如何重新注册这些。我看了一下注册表,可以找到HKLM \ Software \ Microsoft \ Office \ 14.0 \和一堆包括“Access Connectivity Engine”的密钥和子密钥,但是如果有的话,实现ADO还不清楚。我只能假设这些密钥存在的事实和ODBC数据源提到的数据源驱动程序列表中的那些DLL,它们都是*注册的。 – JTeagle 2010-06-17 08:14:11

+0

是否有regsvr64? – 2010-06-18 22:28:03

回答

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

的事情之一,有可能是别人,

尽管是Office 14的版本,你仍然需要使用该提供

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