Невозможно подключиться к базе данных Microsoft Access (C ++)

0

Об этом я рассказывал много статей и форумов, и я до сих пор не нашел решения. Несмотря на то, что на этом сайте есть несколько сообщений.

Они утверждают это как ответы:

Моя рабочая среда выглядит следующим образом:

  • Профессиональный профессионал 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% уверен, что он не заблокирован или что-то подобное. Я создал базу данных самостоятельно, и она состоит всего из двух таблиц, ничего особенного.

Если я перечислил своих поставщиков в windows powershell, я получаю следующие провайдеры:

  • SQLOLEDB

  • MSQLAP

  • MSQLAP

  • MSDataShape

  • SQLNCLI11

  • Microsoft.ACE.OLEDB.12.0

  • ADsDSOObject

  • Перечислитель SQLNCLI11

  • Источник данных поиска Windows

  • MSDASQL

  • Перечислитель MSDASQL

  • SQLUMEDB Enumerator

  • MSDAOSP

Таким образом, механизм туза действительно установлен, как вы можете видеть.

РЕДАКТИРОВАТЬ:

Забыл упомянуть, что это касается локального файла accdb, сделанного в ms access 2010 на моем компьютере. В случае, если это не ясно.

  • 0
    Добро пожаловать в переполнение стека! Обратите внимание, что теги стоят отдельно и не могут быть объединены для создания концепций. То есть объединение [microsoft] , [access] и [database] не означает то же самое, что и тег [ms-access] . Обязательно прочитайте полезные описания, которые появляются при выборе тегов!
Теги:
ms-access
ms-access-2010

2 ответа

1
Лучший ответ

Как сказал Горд. , , Как у вас 32-разрядное приложение, работающее на 64-битной машине? Прежде всего, нужно попытаться синхронизировать их.

У меня была аналогичная проблема с доступом (но тип приложения был правильно настроен для меня, и я был в С#), поэтому я упомянул три вещи, которые повлияли на проблему совместимости, поскольку у нас было такое же сообщение об ошибке.

Перейдите на вкладку свойств в разделе "Сборка". Затем измените целевую платформу с любого 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 вместо того, чтобы сразу вводить его в поле.

Надеюсь это поможет.

0

Если у вас установлена 64-разрядная версия компонента Database Database Engine - aka "ACE" (как часть 64-разрядного Office 2010), и вы на 100% уверены, что ваше приложение работает как 32-битное, m 100% уверен, что он не сработает. 32-разрядные приложения не могут использовать 64-разрядный ACE-драйвер, а 64-разрядные приложения не могут использовать 32-разрядный драйвер ACE. Итак, ваш выбор:

  • настроить приложение на 64-разрядное и использовать существующий 64-разрядный драйвер ACE или
  • замените 64-разрядную версию Office 32-разрядной версией и запустите приложение как 32-разрядное.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню