环境背景:

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

至此,问题解决 ,再没有出现奔溃现象。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐