无法连接到Microsoft Access数据库(C ++)

时间:2014-01-30 18:54:12

标签: c++ ms-access ms-access-2010

我一直在讨论关于这方面的大量文章和论坛,但我仍然没有找到我的解决方案。即使在这个网站上有几个帖子也是如此。

他们将这些事情说明为答案:

我的工作环境如下:

  • 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文件有关。如果不清楚的话。

2 个答案:

答案 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驱动程序。所以,你的选择是:

  • 将您的应用程序配置为以64位运行并使用现有的64位ACE驱动程序或
  • 将32位版本的Office替换为32位版本,并以32位运行您的应用程序。