我一直在讨论关于这方面的大量文章和论坛,但我仍然没有找到我的解决方案。即使在这个网站上有几个帖子也是如此。
他们将这些事情说明为答案:
安装:http://www.microsoft.com/en-us/download/details.aspx?id=13255 我无法安装x86版本,因为我有办公室x64 2010.但我确实安装了该软件包的x64版本。
安装此http://www.microsoft.com/en-us/download/details.aspx?id=23734 我已经尝试过,没有结果。
确保正确定位应用程序(即x86) 我100%肯定我的申请是32位。
我的工作环境如下:
Visual Studio 2012专业人员
编码语言是C ++
Microsoft Office 2010
Windows 8 x64
这是我正在使用的代码:
class Credential
{
public:
TCHAR CredentialID[3];
TCHAR CredentialName[255];
BEGIN_COLUMN_MAP(Credential)
COLUMN_ENTRY(1, CredentialID)
COLUMN_ENTRY(2, CredentialName)
END_COLUMN_MAP()
};
和此:
try
{
CDataSource ds;
CSession session;
ATL::CCommand<CAccessor<Credential>> cust;
HRESULT hr = CoInitialize(0);
if(FAILED(hr))
{
Console_Output("Can't start COM!?\n");
return;
}
hr = ds.OpenFromInitializationString(L"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MPFDatabase.accdb;");
Console_Output("%d\n", hr);
if(FAILED(hr))
{
Console_Output("Can't open Nwind\n");
return;
}
hr = session.Open(ds);
if(FAILED(hr))
{
Console_Output("Can't open Nwind SESSION\n");
ds.Close();
return;
}
TCHAR mySQL[] = "SELECT * FROM Credential";
hr = cust.Open(session, mySQL);
if(FAILED(hr))
{
Console_Output("Can't open Nwind TABLE\n");
session.Close();
ds.Close();
return;
}
while(cust.MoveNext() == S_OK)
{
Console_Output("%s -- %s\n", cust.CredentialID, cust.CredentialName);
}
cust.Close();
session.Close();
ds.Close();
}
catch(std::exception &Ex)
{
Console_Output("ex: %s\n", Ex.what());
}
我达到了调用ds.OpenFromInitializationString的程度,但它会在没有任何通知的情况下停止我的应用程序(也不例外)。或者我到达了它将在我的控制台中打印的位置“无法打开Nwind \ n”。
这2个结果取决于我安装的建议答案。
我已经为我的数据源尝试了绝对和相对路径。 我100%确定它没有锁定或类似的东西。我自己创建了数据库,它只包含2个表,没什么特别的。
如果我在windows powershell中列出我的提供者,我会得到这些提供者:
SQLOLEDB
MSQLAP
MSQLAP
MSDataShape
SQLNCLI11
Microsoft.ACE.OLEDB.12.0
ADsDSOObject
SQLNCLI11枚举器
Windows搜索数据源
MSDASQL
MSDASQL枚举器
SQLOLEDB枚举器
MSDAOSP
所以你可以看到确实安装了ace引擎。
编辑:
忘记提及它与我的计算机上的ms access 2010中的本地accdb文件有关。如果不清楚的话。
答案 0 :(得分:1)
正如戈德所说。 。 。 你如何在64位机器上运行32位应用程序?首先是试图让那些同步。
我遇到了类似的访问问题(但是应用程序类型设置正确,我在c#中)所以我会提到与兼容性问题有关的三件事,因为我们有相同的错误消息。
转到Build下的属性选项卡。然后将Platform Target从默认的Any CPU更改为x64或x86。对我来说,这不是可选的,它在部署时必须设置为正确的,但是当我在本地调试时,它在任何CPU下都能正常工作。
我还必须安装AccessDataBaseEngine_x64,听起来你已经这样了。
接下来要检查的是你的连接字符串。 对我来说,我的本地是x86,我的服务器是x64。
对于我来说,这两个人都参与了这个Jet和ACE设置:
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\your pathj\Database.accdb;";
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\your path\Database.accdb;Jet OLEDB:Database Password=password";
我传递了connectionString,而不是直接将它放入字段中。
希望这有帮助。
答案 1 :(得分:0)
如果您安装了64位版本的Access数据库引擎(也称为“ACE”)(作为64位Office 2010的一部分),并且您100%确定您的应用程序以32位运行然后我100%肯定它不会起作用。 32位应用程序无法使用64位ACE驱动程序,而64位应用程序无法使用32位ACE驱动程序。所以,你的选择是: