【发布时间】: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,它们已注册。