[英]Unable to connect to Microsoft Access Database (C++)
我一直在浏览大量有关此问题的文章和论坛,但仍然找不到我的解决方案。 即使在此网站上也有此帖子。
他们说这些事情作为答案:
安装此程序: http : //www.microsoft.com/zh-cn/download/details.aspx?id= 13255我无法安装x86版本,因为我有Office x642010。但是我确实安装了x64版本那个包裹。
安装此http://www.microsoft.com/zh-cn/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文件有关。 万一不清楚。
正如戈德所说。 。 。 您如何在64位计算机上运行32位应用程序? 第一件事是尝试使它们同步。
我在访问时遇到了类似的问题(但是应用程序类型已为我正确设置,并且我使用的是c#),所以我将提到对兼容性问题有影响的三件事,因为我们有相同的错误消息。
转到“构建”下的“属性”选项卡。 然后将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,而不是直接将其放入字段中。
希望这可以帮助。
如果您安装了64位版本的Access数据库引擎(也称为“ ACE”)(作为64位Office 2010的一部分),并且100%确定您的应用程序以32位版本运行,那么我会m 100%确保它不会起作用。 32位应用程序不能使用64位ACE驱动程序,而64位应用程序不能使用32位ACE驱动程序。 因此,您的选择是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.