2014-01-30 4 views
0

Я прохожу через множество статей и форумов об этом, и я до сих пор не нашел своего решения. Несмотря на то, что на этом сайте есть несколько сообщений.Невозможно подключиться к базе данных Microsoft Access (C++)

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

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

  • Установите этот http://www.microsoft.com/en-us/download/details.aspx?id=23734 Я пробовал, нет никаких результатов.

  • Убедитесь, что приложение настроено верно (т. Е. X86) Я на 100% уверен, что мое приложение 32 бит.

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

  • Visual Studio 2012 профессиональный

  • Coding язык 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 Enumerator

  • Windows Search Data Source

  • MSDASQL

  • MSDASQL Enumerator

  • SQLOLEDB Enumerator

  • MSDAOSP

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

EDIT:

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

+0

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

ответ

1

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

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

Перейти к закладке свойств под сборкой. Затем измените целевую платформу с любого 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- бит, то я на 100% уверен, что он не сработает. 32-разрядные приложения не могут использовать 64-разрядный ACE-драйвер, а 64-разрядные приложения не могут использовать 32-разрядный драйвер ACE. Итак, ваш выбор:

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