Я прошел через тонны статей и форумов по этому поводу, и я до сих пор не нашел свое решение. Хотя на этом сайте также есть несколько сообщений об этом.
Они заявляют эти вещи как ответы:
Установите это: 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 на моем компьютере. В случае, если это не было ясно.
Как сказал Горд. , ,
Как у вас работает 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 вместо того, чтобы поместить его в поле напрямую.
Надеюсь это поможет.
Если у вас установлена 64-разрядная версия ядра СУБД Access, также называемая «ACE», (как часть 64-разрядной версии Office 2010), и вы на 100% уверены, что ваше приложение работает как 32-разрядная, тогда я ‘ м 100% уверен, что это не сработает. 32-разрядные приложения не могут использовать 64-разрядный драйвер ACE, а 64-разрядные приложения не могут использовать 32-разрядный драйвер ACE. Итак, ваш выбор: