Из надстройки 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();
Консоль работает.Надстройка не.
Как это возможно?Офис возится с резолюцией Ассамблеи?