Соединение с базой данных SQL Server разорвано после принудительного выключения компьютера

В моем приложении для хранения данных используется SQL Server 2012 Express и база данных .mdf. Иногда конечный пользователь выключает Windows и компьютер (планшет), удерживая кнопку питания нажатой в течение 5 секунд. Это делается, пока мое приложение все еще работает. Обратите внимание, что приложение запускается в полноэкранном режиме при запуске, заменяя оболочку Windows, поэтому нет доступа к графическому интерфейсу Windows, но есть специальная кнопка меню выключения, которую можно использовать для безопасного выключения Windows и компьютера.

Когда выполняется принудительное завершение работы, при следующем запуске моего приложения оно сообщает об ошибке подключения к базе данных. У меня нет точного сообщения об исключении, потому что оно не отображается, но невозможно создать соединение с базой данных.

Вот моя строка подключения, если она поможет:

"Источник данных=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;Экземпляр пользователя=true;База данных=MeasDatabase"

Я думаю, что Database=MeasDatabase — это просто пережиток прошлого. Вы, вероятно, можете игнорировать это. Хотя с включенным работает нормально.

В большинстве случаев помогает, если вы выключите систему рекомендуемым способом из главного меню. То есть в следующий раз подключение к БД создастся без проблем. Но был как минимум один случай, когда перезагрузка системы не помогала. Пришлось переустановить SQL Server и соответствующее программное обеспечение.

Таким образом, похоже, что что-то (дескрипторы файлов и т. д.) остается открытым, когда выполняется принудительное завершение работы, и части очищаются при следующем выполнении правильного завершения работы Windows.

У вас есть идеи, что может быть причиной этого?

Есть ли что-то, что я мог бы попробовать с помощью кода (С#), чтобы очистить любые открытые файлы базы данных и т. Д., Если соединение не может быть создано?

Я мог бы попробовать запустить перезагрузку системы, если соединение не может быть создано, но не уверен, что это надежное решение.

Конечные пользователи ничего не знают о том, как починить систему, поэтому либо заставляют приложение справляться с ситуацией, либо компьютер приходится отправлять обратно для исправления. В настоящее время единственное решение состоит в том, чтобы убедить конечных пользователей не принудительно выключать систему.

Добавлена ​​новая информация

Самое смешное... Я несколько раз тестировал принудительное отключение на виртуальной машине VirtualBox. Наконец-то я смог покалечить систему так, что приложение перестало запускаться. Экран оставался черным после загрузки оболочки. То есть мое приложение не запустилось, поэтому оболочка не отображается.

Затем я вернул оболочку обратно в explorer.exe и перезапустил виртуальную машину. Как только рабочий стол Windows был загружен, я запустил свое приложение. Процесс был остановлен через несколько секунд. В средстве просмотра событий были сообщения об ошибках, которые не помогли.

Когда я собрал приложение в отладочную версию, скопировал бинарники на виртуальную машину и запустил отладочную версию, она запустилась без проблем. Затем я запустил первоначальную релизную версию с правами администратора (т.е. запускал от имени администратора), и она запустилась без проблем. Однако это не удалось, когда я запустил его в обычном режиме (двойной щелчок).

Используемый пользователь/учетная запись Windows имеет только права пользователя.

Таким образом, эта проблема, по-видимому, также включает права учетной записи/пользователя Windows. Похоже, мне нужно еще немного проверить это с виртуальной машиной...

Добавлена ​​новая информация

Вот записи просмотра событий (одна информация и две ошибки).


Ведро ошибок, тип 0 Имя события: APPCRASH Ответ: Недоступно Идентификатор кабины: 0

Сигнатура проблемы: P1: MainApp.exe P2: 5.2.0.28 P3: 5b0ffa7b P4: KERNELBASE.dll P5: 10.0.10240.16384 P6: 559f38c3 P7: e0434352 P8: 000000000002a1c8 P9: P10:

Прикрепленные файлы:

Эти файлы могут быть доступны здесь: C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_MainApp.exe_413415e952ca4992397ea1ba8821d95738eff9fd_1ae84d98_07bd340d

Символ анализа: Повторная проверка решения: 0 Идентификатор отчета: a86731b4-87b7-4001-8491-142c67c13f5e Состояние отчета: 4102 Хешированное ведро:


Имя сбойного приложения: MainApp.exe, версия: 5.2.0.28, отметка времени: 0x5b0ffa7b Имя сбойного модуля: KERNELBASE.dll, версия: 10.0.10240.16384, отметка времени: 0x559f38c3 Код исключения: 0xe0434352 Смещение ошибки: 0x000000000002a1c8 время запуска приложения: 0x01d3f8e55c5cac83 Путь сбойного приложения: C:\Program Files (x86)\Company\Application\MainApp.exe Путь сбойного модуля: C:\Windows\system32\KERNELBASE.dll Идентификатор отчета: a86731b4-87b7-4001-8491- 142c67c13f5e Полное имя сбойного пакета: Идентификатор сбойного связанного с пакетом приложения:


Приложение: MainApp.exe Framework Версия: v4.0.30319 Описание: Процесс был прерван из-за необработанного исключения. Информация об исключении: System.TypeInitializationException Stack: at MainApp.App.Main()


Похоже, приложение больше не запускается с правами пользователя. Я поставил окно сообщения в самом начале, но оно не появилось. Только когда я запускал приложение с правами администратора.

Не уверен, что эта проблема с виртуальной машиной — совсем другая история. Основное внимание, вероятно, следует уделить проблеме подключения к базе данных после принудительного отключения. Эта проблема с виртуальной машиной не исчезает после безопасного перезапуска, как проблема с подключением к базе данных (по словам пользователей).

Добавлена ​​новая информация

В качестве примечания: проблема с запуском приложения на виртуальной машине, по-видимому, связана с проблемой безопасности или чем-то, связанным с номером версии.

Я удалил не запускающуюся версию, создал новую версию/установщик с увеличенным номером версии, и после установки на виртуальную машину он запустился нормально. Затем я удалил новую версию, собрал другую версию/установщик, но с исходным неначальным номером версии, и после установки он не запустился. Иди разберись...

К вашему сведению, по крайней мере. Поделитесь знаниями и так далее...

Добавлена ​​новая информация

Похоже, что уничтожение виртуальной машины повредило файл user.config моего приложения. Он находится в папке AppData (например, C:\Users\[Ваше имя]\AppData\Local\[CompanyName]\[ApplicationName].exe_[RandomString]\[VersionNumber]). Файл был заполнен пробелами. Я удалил файл, и он был создан заново при запуске приложения - и без прав администратора.

Я подумал, что странно, что приложение было завершено еще до того, как оно получило основной метод. Больше похоже на проблему под капотом, и это было так. Так что, по крайней мере, это было решено, хотя это и не было главной проблемой. :)

Возможно, я реализую этот автоматический перезапуск компьютера, если соединение с базой данных не может быть создано. Облегчает жизнь пользователю, хоть он и виноват. Они оплачивают ваши счета...

Надеюсь, этого будет достаточно, но мне все же интересно услышать, есть ли у вас какие-либо другие идеи, чтобы справиться с этим.


person Community    schedule 31.05.2018    source источник
comment
Добавлена ​​новая информация.   -  person    schedule 31.05.2018
comment
Не уверен, что это уместно, но на всякий случай я хочу подчеркнуть часть User Instance = true строки подключения.   -  person    schedule 31.05.2018
comment
У меня нет точного сообщения об исключении. Вам нужно добавить ведение журнала, чтобы зафиксировать эту информацию, или посмотреть в средстве просмотра событий. В средстве просмотра событий были сообщения об ошибках, которые не помогли - Что это было?   -  person Alex K.    schedule 31.05.2018
comment
Добавлены записи просмотра событий.   -  person    schedule 31.05.2018
comment
Как насчет того, чтобы добавить ссылку на тот же самый пост, который вы сделали в msdn? вот так   -  person SMor    schedule 31.05.2018
comment
В прошлом у меня было много неудачного опыта с мертвыми ссылками...   -  person    schedule 31.05.2018
comment
Скажите пользователю не принудительно завершать работу. Они, вероятно, испортят свой компьютер, делая это, а не только ваше приложение. Нет обходного пути, чтобы избежать потенциальной потери данных таким образом, кроме регулярного резервного копирования. Решение состоит в том, чтобы пользователь правильно работал с Windows.   -  person Jacob H    schedule 31.05.2018
comment
Привет @SanApp и добро пожаловать в Stack Overflow! Вы пытались сократить это до минимального, полного и проверяемого примера? Это и облегчает решение проблемы, и может привести вас к решению самостоятельно. Удачи!   -  person Max von Hippel    schedule 31.05.2018
comment
Добавлена ​​новая информация.   -  person    schedule 01.06.2018
comment
Добавлено решение проблемы запуска приложения.   -  person    schedule 01.06.2018


Ответы (1)


Вы можете попробовать следующее в своем приложении

private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
// Verify that we're not being closed because windows is shutting down.
    if (e.CloseReason == CloseReason.WindowsShutDown)
    {
    //close all db connections 
    }
}

Но даже при этом может случиться так, что принудительное завершение работы что-то делает с SQL Server Express вне контроля вашего приложения.

person Eric Yang    schedule 31.05.2018
comment
Насколько я понимаю, это не правильное, чистое отключение, а принудительное, сравнимое с выдергиванием вилки из розетки. Удержание питания 5 секунд во многих таких случаях означает резкое отключение питания. - person Peter B; 01.06.2018