强制计算机关闭后SQL Server数据库连接中断

时间:2018-05-31 12:59:19

标签: c# sql-server shutdown sql-server-2012-express mdf

我的应用程序使用SQL Server 2012 Express和.mdf数据库来存储数据。有时,最终用户通过按住电源按钮5秒钟来关闭Windows和计算机(平板电脑)。这是在我的应用程序仍在运行时完成的。请注意,应用程序在启动时全屏启动,取代Windows shell,因此无法访问Windows GUI,但有一个专用的关闭菜单按钮用于安全关闭Windows和计算机。

执行强制关闭时,下次启动应用程序时,会报告数据库连接错误。我没有确切的异常消息,因为它没有显示,但无法创建与数据库的连接。

这是我的连接字符串,如果它提供任何帮助:

"数据源=。\ SQLEXPRESS; AttachDbFilename = | DataDirectory | \ Database.mdf; Integrated Security = True; User Instance = true; Database = MeasDatabase"

我认为数据库= MeasDatabase只是旧时代的遗物。你可以忽略它。但是,包含它的工作正常。

大多数情况下,如果您从主菜单中按建议的方式关闭系统,它会有所帮助。即,下次创建数据库连接时没有任何问题。但至少有一次重启系统无济于事。不得不重新安装SQL Server和相关软件。

因此,当执行强制关闭时,看起来某些东西(文件句柄等)保持打开状态,并且在下次执行正确的Windows关闭时清除这些部分。

你知道可能导致这种情况的原因吗?

如果无法创建连接,是否可以尝试以代码方式(C#)清理任何打开的数据库文件等?

如果无法创建连接,我可以尝试触发系统重启,但不确定这是否是一个万无一失的解决方案。

最终用户无需做任何事情来修复系统,因此它要么让应用程序处理这种情况,要么必须将计算机送回来进行修复。目前唯一的解决方案是强调最终用户不要强制关闭系统。

添加了新信息

最有趣的事情......我使用VirtualBox虚拟机测试了几次强制关机。我终于能够削弱系统,使应用程序不再启动。装入外壳后屏幕保持黑色。即,我的应用程序无法启动,因此无法显示shell。

然后我将shell还原为explorer.exe并重新启动虚拟机。加载Windows桌面后,我启动了我的应用程序。几秒钟后,该过程停止。事件查看器中有错误消息,但没有提供任何帮助。

当我将应用程序构建到调试版本中时,将二进制文件复制到虚拟机并启动调试版本,它开始没有任何问题。然后我启动了具有管理员权限的原始发行版本(即以管理员身份运行),并且它开始没有任何问题。但是,当我正常启动时(双击)它失败了。

正在使用的Windows用户/帐户只有用户权限。

所以这个问题似乎也包括Windows帐户/用户权限。看起来我需要使用虚拟机进行更多测试......

添加了新信息

以下是事件查看器条目(一个信息和两个错误)。

故障桶,输入0 事件名称:APPCRASH 回复:不可用 驾驶室ID: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 \微软\的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 错误进程id:0xdfc 错误应用程序启动时间:0x01d3f8e55c5cac83 错误的应用程序路径:C:\ Program Files(x86)\ Company \ Application \ MainApp.exe 错误模块路径:C:\ Windows \ system32 \ KERNELBASE.dll 报告编号:a86731b4-87b7-4001-8491-142c67c13f5e 错误包全名: 错误的包相关应用程序ID:

应用程序:MainApp.exe 框架版本:v4.0.30319 描述:由于未处理的异常,进程终止。 异常信息:System.TypeInitializationException 堆:    在MainApp.App.Main()

看起来该应用程序不再以用户权限启动。我在一开始就设置了一个消息框,但它并没有显示出来。仅当我以管理员权限运行应用程序时。

不确定此虚拟机问题是否是另一个故事。主要关注点应该是强制关闭后的数据库连接问题。这个虚拟机问题不会随着安全重启而消失,就像数据库连接问题一样(根据用户而定)。

添加了新信息

作为旁注,在虚拟机中启动应用程序的问题似乎是某种安全问题,或与版本号相关的问题。

我卸载了非启动版本,构建了一个版本号递增的新版本/安装程序,在虚拟机上安装后,它正常启动。然后我卸载了新版本,使用原始的非启动版本号构建了另一个版本/安装程序,安装后它没有启动。去图......

仅供参考。分享知识等等......

添加了新信息

看起来杀死虚拟机会损坏我的应用程序的user.config文件。它位于AppData文件夹中(例如C:\ Users \ [YourName] \ AppData \ Local \ [CompanyName] \ [ApplicationName] .exe_ [RandomString] \ [VersionNumber])。该文件充满了空格。我删除了该文件,并在启动应用程序时重新创建 - 并且没有管理员权限。

我认为应用程序在获得主要方法之前终止是很奇怪的。感觉更像是一个引擎盖下的问题,而且确实如此。所以至少那个问题已经解决了,尽管它并不是主要问题。 :)

如果无法创建与数据库的连接,我可能会实现自动计算机重启。尽管他是罪魁祸首,但让用户的生活更轻松一些。他们付账单......

希望这已经足够了,但我仍然有兴趣听听你是否有任何其他想法来处理这个问题。

1 个答案:

答案 0 :(得分:0)

您可以在申请中尝试以下内容

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表达式执行