我们有一个使用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代码库是不可取的!
答案 0 :(得分:2)
("Provider=Microsoft.ACE.OLEDB.14.0;")
其中一件事,可能还有其他事情,
尽管是office 14版本,您仍然需要使用Office 12引用作为提供者
即
("Provider=Microsoft.ACE.OLEDB.12.0;")