逾時錯誤表示特定作業所花費的時間超過需求。 用戶端應用程式會停止作業(而不是無限期等候),這可能會封鎖其他作業並暫停應用程式。 本文提供連線到 SQL Server 時所收到的「命令逾時」和「連線逾時」錯誤的解決方案。
System.Data.SqlClient.SqlException (0x80131904):連線逾時已過期。
嘗試取用登入前的交握確認時超過逾時時間。
這可能是因為登入前交握失敗,或伺服器無法及時回應。
嘗試連線到這部伺服器所花費的時間為 [登入前] 初始化=23;交握=14979;
System.ComponentModel.Win32Exception (0x80004005):等候作業已逾時。
請參閱下列連線逾時呼叫堆疊範例:
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.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt,Boolean trustServerCert, Boolean& marsCapable)
at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnectionowningObject)
at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfoserverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
SqlConnection.Open
表示客戶端嘗試開啟連線,因此與查詢無關。
請參閱下列查詢或命令逾時呼叫堆疊的範例:
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.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
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, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteScalar()
類別 SqlCommand
是用來處理查詢,而不是連接。 方法 ExecuteScalar
可用來執行查詢。 您也可以檢視其他專案,例如 ExecuteReader
或 ExecuteNonQuery
。
針對逾時過期錯誤進行疑難解答
如果您遇到查詢或命令逾時錯誤,請參閱 針對查詢逾時錯誤進行疑難解答。
如果您遇到連線逾時錯誤,請遵循下列步驟:
增加連線逾時參數。
如果您使用應用程式連線到 SQL Server,請增加相關的連線逾時參數值,並檢查連接最終是否成功。 例如,如果您使用 System.Data.SqlClient
,請將 SqlConnection.ConnectionTimeout 屬性設定為 30 或更高的值。
如果您使用其他提供者,請檢查 首頁以取得 SQL 用戶端程序設計。
如果您使用 SQL Server Management Studio (SSMS),請選取 [連接到伺服器] 對話方塊中的 [連線屬性] 索引標籤,並將 [連線逾時] 設定為較高的值。
如果連線最終成功,則這是網路問題。 您必須與網路管理員合作,才能解決問題。 解析之後,您可以還原為應用程式中的預設設定。
增加應用程式中的聯機逾時是可行的方法,但不是長期解決方式。 這是因為當您嘗試連線到數據源時,聯機會快速發生(通常是在幾毫秒內)。
資料庫引擎 未接聽埠 1433。 這是因為埠已變更,或不是默認實例,而且 SQL Server Browser 服務未執行。
啟動 SQL Server Browser 服務,或指定 TCP/IP 埠號碼以使用 命令進行 Sqlcmd -S <ip_addres>,<port>
連線。 在錯誤記錄檔中,尋找 SQL Server 正在接聽的埠號碼。
SQL Server Browser 服務正在執行,但 UDP 連接埠 1434 遭到防火牆封鎖。
設定防火牆以允許存取伺服器上的UPD埠1434,或指定要連線的TCP/IP埠號碼。
用戶端和伺服器未設定為使用相同的網路通訊協定。
使用 SQL Server 組態管理員,確定伺服器和用戶端電腦至少有一個啟用的通訊協定。 例如,如果用戶端是使用 TCP/IP 套接字進行連線,但 SQL Server 只會在命名管道上接聽,則無法建立連線能力。
網路無法將伺服器名稱解析為IP位址,這可以使用 ping 或 telnet 程式進行測試。
修正網路上的計算機名稱解析問題,或使用IP位址連線到伺服器,這不是SQL Server 問題。 如需協助,請參閱您的 Windows 檔或連絡網路管理員。 使用下列命令來測試連線能力:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
如果使用IP位址可運作,但伺服器名稱無法運作,則為名稱解析問題。
網路無法使用IP位址進行連線,這可以使用 ping、telnet 或 tracert 程式進行測試。
修正網路上的 TCP/IP 問題,這不是 SQL Server 問題。 如需協助,請參閱您的 Windows 檔或連絡網路管理員。
如需更進階的網路疑難解答,請參閱 0300 間歇性或定期網路問題。
針對 SQL Server 中的連線問題進行疑難排解