【问题标题】:Access, ADO & 64-bit访问、ADO 和 64 位
【发布时间】:2010-06-16 12:20:10
【问题描述】:

我们有一个在 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数据 提供程序 (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 for x64 完全发布并在外部运行。

然而,我们仍然收到 COM 错误 0x800a0e7a (Provider not found)。

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

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

【问题讨论】:

  • 您确定 64 位组件已正确注册?
  • 不幸的是我不知道。我找到了包含 ace*.dll 文件的目录,但 regsvr32 对它们不起作用。它们可能是互操作程序集,不记得如何重新注册它们。我查看了注册表,可以找到 HKLM\Software\Microsoft\Office\14.0\ 和一堆键和子键,包括“Access Connectivity Engine”,但不清楚哪个(如果有的话)实现了 ADO。我只能假设这些键存在并且 ODBC 数据源在 dat 源驱动程序列表中提到了这些 DLL,它们注册。

标签: ms-access ado 64-bit


【解决方案1】:
("Provider=Microsoft.ACE.OLEDB.14.0;")

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

尽管是 Office 14 版本,您仍需要使用提供程序的 Office 12 参考

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

【讨论】:

    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多