繁体   English   中英

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

[英]Unable to connect to Microsoft Access Database (C++)

我一直在浏览大量有关此问题的文章和论坛,但仍然找不到我的解决方案。 即使在此网站上也有此帖子。

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

我的工作环境如下:

  • 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驱动程序。 因此,您的选择是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM