У меня есть приложение Windows Forms (.NET 3.5). Строка подключения базы данных хранится в файле app.config
в разделе appSettings
с именем «connectionString».
<appSettings>
<add key="connectionString" value="Data Source=REDACTED;Initial Catalog=REDACTED; UID=REDACTED; pwd=REDACTED;" />
</appSettings>
Доступ к нему в коде для запросов к базе данных с помощью следующего кода:
dbConnString = ConfigurationSettings.AppSettings["connectionString"];
Setup
Потому что у меня возникли проблемы, я завален запуска и применимые разделы приложение с операциями MessageBox.Show()
, каждое из которых дает соответствующую информацию о том, где я нахожусь в программе, и каковы значения переменных.
У меня есть проект установщика, который создает файл MSI. Я беру этот файл, копирую его на компьютер клиента и устанавливаю его (если приложение уже установлено, я сначала его удалю).
Проблема
Я вижу некоторые действительно странное поведение ...
- При запуске приложения в качестве администратора (правой кнопкой мыши> Запуск от имени администратора), приложение запускается как и ожидалось , Он выбирает ожидаемую строку подключения (
Data Source=REDACTED;Initial Catalog=REDACTED; UID=REDACTED; pwd=REDACTED;
) и без проблем подключает приложение к базе данных. Обратите внимание, что в строке подключения используется проверка подлинности SQL Server (а не проверка подлинности Windows). - Если я просто дважды щелкнул файл .exe или запустил его из меню «Пуск», я получаю абсолютно РАЗЛИЧНОЕ значение строки подключения. Я верну это вместо этого (в том же месте в коде):
Data Source=REDACTED;Integrated Security=SSPI;Initial Catalog=REDACTED
. Обратите внимание, что для проверки соединения с базой данных используется проверка подлинности Windows. - Если я полностью удаляю файл
app.config
, приложение все еще работает (да, как?), Но с некоторыми отличиями:
a. Если я запускаю его как администратор, он не может найти строку подключенияconnectionString
, и я получаю ошибку «Ссылка на объект не установлена в экземпляр объекта».
b. Если я запускаю из меню «Пуск» или дважды щелкнув файл .exe, он возвращает строку подключения к аутентификации Windows. - Я решил попробовать что-то еще. Я изменил имя строки подключения (
connectionString
) в файлеapp.config
. Поэтому я назвал егоconnectionStringDude
. Теперь, когда я запускаю его двумя способами, описанными выше, снова запускается версия «Запуск от имени администратора», но другая не может найти строку подключения по этому имени, и приложение получает ссылку «Объект», не установленную в экземпляр объект.'.
Таким образом, мне кажется, что существует какая-то иерархия, которую приложение использует для поиска строки подключения connectionString
. Если структура не может найти строку подключения в app.config, она проверяет файл machine.config и т. Д., Пока он не найдет его или нет.
Я разрываю волосы, пытаясь понять это.Почему строка подключения CHANGE основывается только на «Запуск от имени администратора»?
И только, чтобы быть ясно, в той же строке кода:
dbConnString = ConfigurationSettings.AppSettings["connectionString"];
возвращается совершенно другое значение, в зависимости от dbConnString если я Ран в качестве администратора или нет.
Хорошо, я сделаю это. Спасибо! – richard