winform调用数据库,经常莫名其妙的发生两种错误,然后软件崩溃关闭
1.超时时间已到。在操作完成之前超时时间已过或服务器未响应
2.在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。) 以上错误莫名其妙不定时发生,可能几天一次也可能一天几次。初步判断是网络不稳定造成的。我的代码已经加了try
 
   public void ExecuteNonQuery(string SQLText)
        {
            mCommand.CommandType = CommandType.Text; 
            mCommand.CommandText = SQLText;
            mCommand.CommandTimeout = 3600;
            try
            {
                mCommand.Connection.Open();
                mCommand.ExecuteNonQuery().ToString();
            }
            catch (Exception e) {}            finally//无论是否异常调用完毕关闭数据库
            {
                mCommand.Connection.Close();
                ClearParameters();
            }
        }我不想因为数据库连接问题使得软件崩溃怎么改进上述代码?

解决方案 »

  1.   

    如果网络情况不好,就要建立重连机制外面做个循环,直到里面没有catch捕捉到错误,才算执行ok~
      

  2.   

    方法改成布尔值返回        public bool ExecuteNonQuery(string SQLText)
            {
                bool res = false;
                mCommand.CommandType = CommandType.Text;
                mCommand.CommandText = SQLText;
                mCommand.CommandTimeout = 3600;
                try
                {
                    mCommand.Connection.Open();
                    mCommand.ExecuteNonQuery().ToString();
                    res = true;
                }
                catch (Exception e) { }            finally//无论是否异常调用完毕关闭数据库
                {
                    mCommand.Connection.Close();
                    ClearParameters();
                }
                return res;
            }
    调用方法判断一下,如果想一直尝试到成功才结束就用while,
    否则用个计数器,判断下不成功的话连续尝试几次
                bool res = false;
                while (res)
                {
                    res = ExecuteNonQuery(SQLText);
                }
      

  3.   

    我想调用错误一次就放弃此次操作
     bool res = false;
                while (res)
                {
                    res = ExecuteNonQuery(SQLText);
                }
    这样根本不行的。。因为ExecuteNonQuery(SQLText);这里执行一次就崩溃了。。
    和返回的类型应该没关系,因为即便是false也没理由崩溃吧,以下是调试跟踪到的代码
    程序发生未处理的异常: System.Data.SqlClient.SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 在 System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 在 System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 在 System.Data.SqlClient.TdsParserStateObject.ReadByte() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) 在 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) 在 System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) 在 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) 在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) 在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open() 在 DBbase.Database.ExecuteDataSet(String SQLText, String VisualTableName, Int32 StartIndex, Int32 Count) 在 DBbase.Database.ExecuteDataSet(String SQLText) 在 GetIDStr.TagID(String para, String str, String conn) 在 FHCT.main.MainGetInfos.GetInfo(Object Para) 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart(Object obj) 
      

  4.   

    晕菜,怎么CODE显示成一行了,看下面
    程序发生未处理的异常: System.Data.SqlClient.SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 在 System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 在 System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 在 System.Data.SqlClient.TdsParserStateObject.ReadByte() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) 在 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) 在 System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) 在 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) 在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) 在 System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) 在 System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open() 在 DBbase.Database.ExecuteDataSet(String SQLText, String VisualTableName, Int32 StartIndex, Int32 Count) 在 DBbase.Database.ExecuteDataSet(String SQLText) 在 GetIDStr.TagID(String para, String str, String conn) 在 FHCT.main.MainGetInfos.GetInfo(Object Para) 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart(Object obj) 
      

  5.   

    第二种错误
    ------------------------------
    程序发生未处理的异常: System.Data.SqlClient.SqlException: 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。) 在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.WriteSni() 在 System.Data.SqlClient.TdsParserStateObject.WritePacket(Byte flushMode) 在 System.Data.SqlClient.TdsParserStateObject.ExecuteFlush() 在 System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(String text, Int32 timeout, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) 在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable) 在 DBbase.Database.ExecuteDataSet(String SQLText, String VisualTableName, Int32 StartIndex, Int32 Count) 在 DBbase.Database.ExecuteDataView(String SQLText) 在 GetIDStr.City(String tb, String msg, String conn) 在 FHCT.main.MainGetInfos.GetInfo(Object Para) 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart(Object obj) 
      

  6.   

    你的意思是没有catch到异常?把catch打印出来
    catch(Exception e){
    Console.Write(e.stacktrace)
    }
      

  7.   

    解决了没有?就结贴了第一种异常是超时,你设了3600秒了还超时?insert或者update什么东西了,会不会有死锁?
    第二种异常是connection断掉了
      

  8.   

    我也遇到了同样的问题
    A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - 远程主机强迫关闭了一个现有的连接。)
    纠结