異常詳細信息: System.ComponentModel.Win32Exception: 遠程主機強迫關閉了一個現有的連接。


[Win32Exception (0x80004005): 遠程主機強迫關閉了一個現有的連接。]

[SqlException (0x80131904): 在從服務器接收結果時發生傳輸級錯誤。 (provider: TCP Provider, error: 0 - 遠程主機強迫關閉了一個現有的連接。)]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1789294
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5340642
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244
   System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) +601
   System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() +256
   System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() +39
   System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer() +125
   System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(Byte[] buff, Int32 offset, Int32 len, Int32& totalRead) +77
   System.Data.SqlClient.TdsParserStateObject.TryReadUInt32(UInt32& value) +5341726
   System.Data.SqlClient.TdsParser.TryReadSqlValueInternal(SqlBuffer value, Byte tdsType, Int32 length, TdsParserStateObject stateObj) +318
   System.Data.SqlClient.TdsParser.TryReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj) +108
   System.Data.SqlClient.SqlDataReader.TryReadColumnInternal(Int32 i, Boolean readHeaderOnly) +258
   System.Data.SqlClient.SqlDataReader.TryReadColumn(Int32 i, Boolean setTimeout, Boolean allowPartiallyReadColumn) +71
   System.Data.SqlClient.SqlDataReader.GetValues(Object[] values) +165
   System.Data.ProviderBase.CommonLanguageSubsetDataReader.GetValues(Object[] values) +11
   System.Data.ProviderBase.SchemaMapping.LoadDataRow() +38
   System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping) +83

 

再次刷新就這樣:

[Win32Exception (0x80004005): 指定的網絡名不再可用。]

[SqlException (0x80131904): 在從服務器接收結果時發生傳輸級錯誤。 (provider: TCP Provider, error: 0 - 指定的網絡名不再可用。)]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1789294
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5340642
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244
   System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) +601
   System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() +256
   System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() +39
   System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer() +64
   System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value) +86
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +222
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +61
   System.Data.SqlClient.SqlDataReader.get_MetaData() +90
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +377
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) +1421
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +177
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +137
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +140
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +316
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +88

 

 

"在從服務器接收結果時發生傳輸級錯誤。 (provider: TCP Provider, error: 0 - 指定的網絡名不再可用。)"
傳輸級錯誤,就是Tds類錯誤,也就是表格數據流協議,是建立在TCP/IP Net-Library之上的,包含在TCP數據段內。TDS用1433端口進行數據庫通信。TDS客戶端使用稱為表格格式數據流 (TDS) 的 SQL Server 專用應用程序級協議來發送 SQL 語句。

大致的過程:
數據包由用於 SQL Server 的 Microsoft OLE DB 提供程序、SQL Server ODBC 驅動程序或 DB-Library DLL 生成。TDS 數據包然后被傳遞給 SQL Server 客戶端 Net-Library,客戶端 Net-Library 將 TDS 數據包封裝為網絡協議數據包。

在服務器上,服務器 Net-Library 接收網絡協議數據包,且析取 TDS 數據包並將其傳遞給關系數據庫服務器。在將結果返回給客戶端時,這一進程反向執行。

從上面也可以看出,這個應該是屬於sql server底層所使用的一種通信協議,這里涉及到了:sql server的進程、網絡、net-library,所以:如果一旦網絡有不穩定或者斷網了,異或,sql server進程出現了問題,再或者這個net-library有bug,那么可能就會導致這個傳輸級錯誤了。

分析其主要原因是“連接斷開”,以下列出幾種相關原因案例:

1、網絡未連接,或者在連接的時候斷網;

2、連接實例的時候sqlserver突然斷了,比如你在使用的時候sqlserver服務不正常關閉等。

3、數據庫有異常,比如數據庫處於“警告”等的狀態,或者數據庫處於受限訪問狀態。也會無法訪問,這種情況比較常見。

4、連接在高並發線程中頻繁地打開和關閉。

我的就是SqlConnection 連接對象在高並發線程頻繁的打開和關閉導致的,所以處理方式就改成了只有在不使用連接的時候才關閉它。

《轉自 http://www.timegowhere.com/post/transporterror.html

 

未解決。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM