超时错误意味着特定操作所用的时间比需要的时间长。 客户端应用程序停止操作(而不是无限期地等待),这可能会阻止其他操作并使应用程序暂停运行。 本文提供连接到 SQL Server 时出现的“命令超时”和“连接超时”错误的解决方法。
超时过期。 The timeout period elapsed prior to completion of the operation or the server is not responding.
System.Data.SqlClient.SqlException (0x80131904): 连接超时已过期。
在尝试使用登录前握手确认时超过了此超时时间。
这可能是因为登录前握手失败或服务器无法及时响应。
尝试连接到此服务器所花费的持续时间为 [登录前] 初始化 = 23; 握手=14979;
System.ComponentModel.Win32Exception (0x80004005):等待操作超时。
System.Data.SqlClient.SqlException (0x80131904): 超时已过期。
The timeout period elapsed prior to completion of the operation or the server is not responding.
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 服务,或使用 Sqlcmd -S <ip_addres>,<port> 命令指定要连接的 TCP/IP 端口号。 在错误日志中,查找 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 中的连接问题