System.Data.SqlClient.SqlException 超時時間已到

衣舞晨風發表於2015-04-23

錯誤資訊:

有關呼叫實時(JIT)除錯而不是此對話方塊的詳細資訊,
請參見此訊息的結尾。

************** 異常文字 **************
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: Timeout 時間已到。在操作完成之前超時時間已過或伺服器未響應。 (錯誤詳細資訊等於 很可能由 IncludeExceptionDetailInFaults=true 建立的 ExceptionDetail,其值為:
System.Data.SqlClient.SqlException: Timeout 時間已到。在操作完成之前超時時間已過或伺服器未響應。
在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
在 Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteNonQuery(DbCommand command)
在 Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DbCommand command)



************** 已載入的程式集 **************
mscorlib
程式集版本:4.0.0.0
Win32 版本:4.0.30319.18444 built by: FX451RTMGDR
基本程式碼:file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------

錯誤資訊或為:

System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. (錯誤詳細資訊等於 很可能由 IncludeExceptionDetailInFaults=true 建立的 ExceptionDetail,其值為:
System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunB...)。

Server stack trace: 
   在 System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
   在 System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)


解決方案:

System.Data.Common.DbCommand sqlStringCommand = this.db.GetSqlStringCommand(SQL);
sqlStringCommand.CommandTimeout = 1800000;
this.db.ExecuteNonQuery(sqlStringCommand);

修改Command的TimeOut屬性未合適的時間即可。


小注:

         也許你會說,我在連線字串中已經 設定了 Connect Timeout=80000 ,並且資料庫中超時連線也是設定的值是一個很大的值。為啥到了30秒,仍然超時了呢??
         這是因為:
         你的設定並沒有問題,是你混淆了  SqlCommand.CommandTimeout  和 SqlConnection.ConnectionTimeout 這兩個的區別了。
         你的連線字串中的超時只是設定的 SqlConnection.ConnectionTimeout 的值,而不是設定的 SqlCommand.CommandTimeout 的值。
         SqlHelper 中並沒有 SqlCommand.CommandTimeout 的相關設定。需要你自己設定。
         下面是兩個的比較:
         SqlCommand.CommandTimeout
         獲取或設定在終止執行命令的嘗試並生成錯誤之前的等待時間。
         等待命令執行的時間(以秒為單位)。預設為 30 秒。
         SqlConnection.ConnectionTimeout
         獲取在嘗試建立連線時終止嘗試並生成錯誤之前所等待的時間。
         等待連線開啟的時間(以秒為單位)。預設值為 15 秒。

小注部分參考:點選開啟連結


相關文章