Об этом я рассказывал много статей и форумов, и я до сих пор не нашел решения. Несмотря на то, что на этом сайте есть несколько сообщений.
Они утверждают это как ответы:
Установите это: http://www.microsoft.com/en-us/download/details.aspx?id=13255 Я не могу установить версию x86, потому что у меня есть офис 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% уверен, что он не заблокирован или что-то подобное. Я создал базу данных самостоятельно, и она состоит всего из двух таблиц, ничего особенного.
Если я перечислил своих поставщиков в windows powershell, я получаю следующие провайдеры:
SQLOLEDB
MSQLAP
MSQLAP
MSDataShape
SQLNCLI11
Microsoft.ACE.OLEDB.12.0
ADsDSOObject
Перечислитель SQLNCLI11
Источник данных поиска Windows
MSDASQL
Перечислитель MSDASQL
SQLUMEDB Enumerator
MSDAOSP
Таким образом, механизм туза действительно установлен, как вы можете видеть.
РЕДАКТИРОВАТЬ:
Забыл упомянуть, что это касается локального файла accdb, сделанного в ms access 2010 на моем компьютере. В случае, если это не ясно.
Как сказал Горд. , , Как у вас 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 вместо того, чтобы сразу вводить его в поле.
Надеюсь это поможет.
Если у вас установлена 64-разрядная версия компонента Database Database Engine - aka "ACE" (как часть 64-разрядного Office 2010), и вы на 100% уверены, что ваше приложение работает как 32-битное, m 100% уверен, что он не сработает. 32-разрядные приложения не могут использовать 64-разрядный ACE-драйвер, а 64-разрядные приложения не могут использовать 32-разрядный драйвер ACE. Итак, ваш выбор:
[microsoft]
,[access]
и[database]
не означает то же самое, что и тег[ms-access]
. Обязательно прочитайте полезные описания, которые появляются при выборе тегов!