Невозможно подключиться к ENCRYPTED Access db (accdb) из VSTO (надстройка Excel), но можно из Console-App - PullRequest
0 голосов
/ 17 мая 2019

Из надстройки VSTO Excel я пытался подключиться к зашифрованной базе данных Access (accdb) с помощью OleDbConnection.(Я пробовал в Excel 2010 и 2016 с разными шаблонами VSTO)

Я получаю Ошибка: System.Data.OleDb.OleDbErrorCollection: «Не верный пароль». Источник исключенияэто: «Microsoft Access Database Engine».

Исключение не содержит никаких внутренних исключений.

Код работает без проблем :

  • из надстройки, если целевая база данных НЕ зашифрована.
  • из консольного приложения, даже если accdb зашифрован.

Таким образом, нет проблем со строкой подключения, путем или паролем .

Что отличается, если код запускается вконтекст надстройки?

Я обнаружил, что некоторые люди сталкивались с подобной проблемой (одно и то же сообщение об ошибке) при попытке подключиться к зашифрованному accdb из ASP.NET и разрешениям для ИнтернетаПроцесс не был правильным.Может ли это быть подсказка?ИМХО Надстройка должна запускаться с правами пользователя, поэтому это не должно быть причиной (и, как описано выше, соединение с базой данных может быть установлено, поэтому файл открыт, пока accdb не зашифрован) ...

public void TestAccessConnect()
        {
            string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + 
                    @"Data Source=C:\temp\encryptedDb.accdb;" +
                    @"Jet OLEDB:Database Password=1234;";

            using (var oleDbConn = new OleDbConnection(connString))
            {
                oleDbConn.Open();  // <---- triggers the following error
                                    // Error: { System.Data.OleDb.OleDbErrorCollection} 
                                    // Source: "Microsoft Access Database Engine"
                                    // Message: "Not a valid password"
            }
        }

Я не нашел в Интернете ничего, касающегося моей проблемы, и у меня заканчиваются идеи.Это (известная) ошибка на стороне MS?

Любые советы о том, где искать, очень ценятся.


Обновление 2019/05/17:

Я обнаружил, что если я зашифровал accdb в «устаревшем шифровании», соединение работает!: - (

Воспроизвести: в Access:

  • Расшифровать базу данных (БД должна быть открыта исключительно)
  • Перейти в Файл -> Параметры -> Клиент-Настройки: там прокрутите до раздела «Дополнительно» и отметьте «Устаревшее шифрование» (вместо «Стандарт» - которое установлено по умолчанию)
  • Закройте базу данных (может быть необязательным)
  • Снова откройтеисключительно база данных
  • Шифрование базы данных.

Et voilà - теперь базу данных можно открыть с помощью пароля от надстройки. Уважаемые парни из MS - какого черта!неработающее шифрование «по умолчанию» существует по крайней мере начиная с Office 2010.

Кроме того: я пытался подключиться напрямую к accdb из Excel 365. Данные -> Получить данные.

  • -> База данных -> Доступ. Не зашифрован (OK), Зашифрован (Fail)
  • -> Другие источники -> OLEDB: (здесь вы можете указать строку подключения). Не зашифрован (OK), Зашифрован(Сбой)
  • -> Другие источники -> ODBC : (Установите новое соединение ODBCздесь вы увидите несколько действительно классных диалоговых окон прошлого века): не зашифрованные (ОК), зашифрованные (ОК)

Ну, похоже, нужнопризнайте, что Microsoft не может должным образом интегрировать свою собственную базу данных в свой офисный пакет.И, эй, прошло всего около 10 лет, а потом это не работает ...

Чтобы убедиться, что это не что-то особенное для Excel, я также создал надстройку для Word.Тот же самый опыт.

Так что в принципе я могу подключиться, либо изменив модель шифрования (не очень практично, потому что есть много экземпляров), либо используя ODBC-Connection (не подходит, потому что я хочу использовать EFЯдро - в данном случае для доступа - (я знаю, я знаю, ... доступ скоро будет прекращен)), либо просто с помощью ADODB или удаленного доступа.

Но у меня все еще есть ощущение, что класс .NET ДОЛЖЕН вести себя как класс .NET - даже если он размещен в приложении Office.

Кто-нибудь знает, чтоможет ли эта простая команда работать?


Обновление № 2 2019/05/17:

Я поместил код подключения в новый проект DLL.Тогда у меня есть проект надстройки и консольное приложение.Оба содержат в основном те же две строки производственного кода:

            var ac = new AccessConnectTest(); // <- class in own assembly
            ac.TestAccessLogin();

Консоль работает.Надстройка не.

Как это возможно?Офис возится с резолюцией Ассамблеи?

...