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

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

Они заявляют эти вещи как ответы:

  • Установите это: http://www.microsoft.com/en-us/download/details.aspx?id=13255
    Я не могу установить версию x86, потому что у меня есть Office x64 2010. Однако я установил версию этого пакета для x64.

  • Установите это http://www.microsoft.com/en-us/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 Enumerator

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

  • MSDASQL

  • MSDASQL Enumerator

  • SQLOLEDB Enumerator

  • MSDAOSP

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

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

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

0

Решение

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

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

Перейдите на вкладку свойств под Build. Затем измените значение Platform Target с любого ЦПУ по умолчанию на x64 или x86. Для меня это не является обязательным, его нужно установить на правильный, когда я развернул, но он работал нормально на любом процессоре, когда я отлаживал локально.

Мне также пришлось установить 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

Другие решения

Если у вас установлена ​​64-разрядная версия ядра СУБД Access, также называемая «ACE», (как часть 64-разрядной версии Office 2010), и вы на 100% уверены, что ваше приложение работает как 32-разрядная, тогда я ‘ м 100% уверен, что это не сработает. 32-разрядные приложения не могут использовать 64-разрядный драйвер ACE, а 64-разрядные приложения не могут использовать 32-разрядный драйвер ACE. Итак, ваш выбор:

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

По вопросам рекламы [email protected]