【问题标题】:Unable to connect to Microsoft Access Database (C++)无法连接到 Microsoft Access 数据库 (C++)
【发布时间】:2014-03-24 20:15:52
【问题描述】:

我已经浏览了大量关于此的文章和论坛,但我仍然没有找到我的解决方案。尽管这个网站上也有好几篇这样的帖子。

他们将这些事情作为答案:

我的工作环境如下:

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!请注意,标签是独立的,不能组合起来创建概念。也就是说,结合[microsoft][access][database][ms-access] 标签的含义不同。请务必阅读选择标签时出现的有用说明!

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


【解决方案1】:

正如戈德所说。 . . 如何在 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,而不是直接将其放入字段中。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果您安装了 64 位版本的 Access 数据库引擎(也称为“ACE”)(作为 64 位 Office 2010 的一部分),并且您 100% 确定您的应用程序以 32 位方式运行那么我 100% 确定它不会起作用。 32 位应用程序不能使用 64 位 ACE 驱动程序,64 位应用程序不能使用 32 位 ACE 驱动程序。所以,你的选择是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多