Разрыв связи с базой данных SQL Server после принудительного выключения компьютера - PullRequest
0 голосов
/ 31 мая 2018

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

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

Вот моя строка соединения, если она предоставляет какую-либо помощь:

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

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

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

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

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

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

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

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

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

Самое смешное ...Я несколько раз тестировал принудительное отключение на виртуальной машине 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.1056 *


Имя ошибочного приложения: MainApp.exe, версия: 5.2.0.28, отметка времени: 0x5b0ffa7b Имя ошибочного модуля: KERNELBASE.dll, версия: 10.0.10240.16384, отметка времени: 0x559f38c3 Код исключения: 0xe0434352 Смещение ошибки: 0x000000000002a1c8 Идентификатор сбойного процесса: 0xdfc Время запуска сбойного приложения: 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 Стек: в MainApp.App.Main ()


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

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

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

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 31 мая 2018

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

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 вне контроля вашего приложения

...