.NET中的SqlCommand.CommandTimeout
和SqlConnection.ConnectionTimeout
之间有什么区别吗?
.NET中的SqlCommand.CommandTimeout
和SqlConnection.ConnectionTimeout
之间有什么区别吗?
是的。 CommandTimeout
是单个命令完成所需的最长时间。 ConnectionTimeout
是建立与服务器连接并开始的最长时间。
例如,您可能正在执行相对运行时间较长的查询 - 他们花费10分钟来完成是完全可以接受的,但如果刚开始建立连接就需要10分钟,那么您会知道出了严重问题。
SqlCommand.CommandTimeout
是你的 SQL 查询的超时限制。意味着一个 (例如:SELECT
, UPDATE
) 查询可以花多少时间来执行。如果它超过了 SqlCommand.CommandTimeout
,那么它就会停止执行。这将导致一个命令超时错误。
SqlConnection.ConnectionTimeout
是你的连接的超时限制。意味着连接对象尝试连接可以花费多长时间。如果它超过指定的时间,它就会停止连接。这将导致一个连接超时错误。
ConnectionTimeout
指定在尝试打开SqlConnection
时等待超时的持续时间。它与Connection.Open()
命令相关。
而
SqlCommand.CommandTimeout
指定了一个SqlCommand在调用Command对象的ExecuteXXX
方法后,在连接已经打开的情况下等待超时的持续时间。
附加信息
CommandTimeout
的默认值为30秒。零(0)表示没有限制。您只能在编码中设置CommandTimeout
的值。
ConnectionTimeout
的默认值为15秒。零(0)同样表示没有限制。小于零的值(负值)将导致ArgumentException
。您可以在编码和配置文件中都设置ConnectionTimeout
的值。
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms
关于 CommandTimeout 的快速说明,因为它是 Connection 和 Command 对象的属性...
在 Connection 对象上设置的 CommandTimeout 对 Command 对象上设置的 CommandTimeout 没有影响;也就是说,Command 对象的 CommandTimeout 属性不会继承 Connection 对象的 CommandTimeout 值。
因此,在 Connection 对象上设置的 CommandTimeout 仅影响仅在该 Connection 下执行的命令(而不使用 Command 对象)。
例如:当您连接到存储过程并向命令对象添加参数,并使用 Connection 对象的连接执行 Command 对象时,您需要在 Command 对象上设置 CommandTimeout 和 Connection 对象上的 ConnectionTimeout 来覆盖两个默认值。在 Connection 对象上设置 CommandTimeout 将无法覆盖 Command 对象命令的默认超时时间。
https://learn.microsoft.com/en-us/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15 https://learn.microsoft.com/en-us/sql/ado/reference/ado-api/connectiontimeout-property-ado?view=sql-server-ver15