gpt4 book ai didi

ms-access - Access 、ADO 和 64 位

转载 作者:行者123 更新时间:2023-12-04 14:43:07 25 4
gpt4 key购买 nike

我们有一个大型代码库,在 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) 版本。 native 已有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旗舰版,64位。测试代码被重新编译在那台机器上使用 VS2008 for x64 完整发布并在外部运行。

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

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

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

最佳答案

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

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

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

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

关于ms-access - Access 、ADO 和 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3053136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com