环境背景:
windows 10+Sql Server2012,开发环境是Visual Studio 2019社区版,Framework 版本: v4.0,用C#写了个应用,在很多地方都正常运行,独独在某台电脑上经常崩溃,查了Windows日志,每次都有两个报错,如下
一、Application Error
错误应用程序名称: OverLoadManage.exe,版本: 1.0.0.0,时间戳: 0xbe0a4e19
错误模块名称: KERNELBASE.dll,版本: 10.0.18362.418,时间戳: 0x2b181c2c
异常代码: 0xe0434352
错误偏移量: 0x00113572
错误进程 ID: 0x2b68
错误应用程序启动时间: 0x01da2fd6d15b657e
错误应用程序路径: D:\治超精检系统\bin\x86\Debug\OverLoadManage.exe
错误模块路径: C:\Windows\System32\KERNELBASE.dll
报告 ID: ae4c3f6b-c6bb-477a-99dd-bce532193ec9
错误程序包全名:
错误程序包相对应用程序 ID:
二、.Net Runtime
应用程序: OverLoadManage.exe
Framework 版本: v4.0.30319
说明: 由于未经处理的异常,进程终止。
异常信息: System.Data.SqlClient.SqlException
在 System.Data.SqlClient.SqlConnection.OnError(System.Data.SqlClient.SqlException, Boolean, System.Action`1<System.Action>)
在 System.Data.SqlClient.SqlInternalConnection.OnError(System.Data.SqlClient.SqlException, Boolean, System.Action`1<System.Action>)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(System.Data.SqlClient.TdsParserStateObject, Boolean, Boolean)
在 System.Data.SqlClient.TdsParser.TryRun(System.Data.SqlClient.RunBehavior, System.Data.SqlClient.SqlCommand, System.Data.SqlClient.SqlDataReader, System.Data.SqlClient.BulkCopySimpleResultSet, System.Data.SqlClient.TdsParserStateObject, Boolean ByRef)
在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
在 System.Data.SqlClient.SqlDataReader.get_MetaData()
在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(System.Data.SqlClient.SqlDataReader, System.Data.SqlClient.RunBehavior, System.String, Boolean, Boolean, Boolean)
在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, Boolean, Int32, System.Threading.Tasks.Task ByRef, Boolean, Boolean, System.Data.SqlClient.SqlDataReader, Boolean)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String, System.Threading.Tasks.TaskCompletionSource`1<System.Object>, Int32, System.Threading.Tasks.Task ByRef, Boolean ByRef, Boolean, Boolean)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(System.Data.CommandBehavior, System.String)
在 System.Data.SqlClient.SqlCommand.ExecuteReader()
在 OverLoadManage.FormGetDataNew.UploadRecordData()
在 OverLoadManage.FormGetDataNew.ThreadUploadBack()
在 System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
在 System.Threading.ThreadHelper.ThreadStart()
分析
一开始以为是病毒,重装了2次都没有解决,后来仔细看故障的奔溃点基本上跟数据库操作的时候报错崩溃,发现两个疑似问题,一个是当连接远程数据库失败时Connection没有及时释放,于是修改成如下
private bool CreateRemoteDBConnect() //创建远程数据库连接
{
RemoteDBConnectStr = "server=" + RemoteDBServer + ";database =" + RemoteDBName + "; uid=" + RemoteDBUser + "; pwd=" + RemoteDBPassword;
try
{
RemoteSqlConnection = new SqlConnection(RemoteDBConnectStr);
RemoteSqlCommand = new SqlCommand();
RemoteSqlCommand.Connection = RemoteSqlConnection;
RemoteSqlConnection.Open();
return true;
}
catch (Exception ex)
{
string tmpStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "--" + "连接远程数据库失败:" + ex.Message;
DebugIntoDGVSystemRunState(tmpStr);
return false;
}
finally
{
RemoteSqlCommand.Dispose();
RemoteSqlConnection.Close();
}
}
二是这个.Net版本可能有Bug,把.Net 4.0换成了.Net 4.5
至此,问题解决 ,再没有出现奔溃现象。