SqlCommand.CommandTimeoutとSqlConnection.ConnectionTimeoutの違いは何ですか?


回答:


127

はい。CommandTimeout1つのコマンドが完了するまでにかかる時間です。ConnectionTimeout最初にサーバーへの接続を確立するのにかかる時間です。

たとえば、比較的長時間実行されるクエリを実行している場合、完了するまでに10分かかることはまったく問題ありませんが、接続を開始するのに10分かかる場合は、何かがひどく間違っていることがわかります。


5
議論のために、私が!**&#Q @を持っているとしましょう?実行に32秒かかるクエリ。SqlCommand.CommandTimeout = 40に設定したが、SqlConnection.ConnectionTimeoutをデフォルト(おそらく30)のままにした場合、接続はタイムアウトしますか?つまり、両方のプロパティを設定する必要がありますか?「いいえ」と言っているように聞こえますが、SqlConnection.ConnectionTimeoutプロパティを忘れて、CommandTimeoutを設定することで必要なすべてが実行されるかどうかを疑問視し始めたに違いありません。
フリップダウト2009

29
flipdoubt-CommandTimeoutはクエリに影響しますが、ConnectionTimoutは影響しません。ConnectionTimoutは、クエリを実行するための接続のタイムアウトではありません。そもそも、接続がデータベースに接続するためのタイムアウトです。
ロビンベネット

1
@JonSkeetはCommandTimeoutとConnectionTimeoutを実行しますが、どちらも同じ共通の例外を生成しますか?または別の例外?
Yasser Shaikh 2016年

1
@Yasser:わかりません、怖いです。
Jon Skeet 2016年

6
CommandTimeoutは、最初の行がSQLServerからクライアントコードに返される時点までにのみ適用されるように見えることに注意してください。たとえば、30秒以内に最初の行を返すクエリがあるが、行セット全体が戻るのに数時間かかる場合、タイムアウトを30秒に設定してもクエリはタイムアウトせず、クエリは数時間実行されます。これは主に、実行プランのLHSにブロッキング演算子(Order byなど)がない場合に当てはまります。(私はこれをデバッグするのに2日間を費やし、この主題に関する他の参照はなかったため、投稿しました)
Dave

28

SqlCommand.CommandTimeout= SQLクエリのタイムアウト制限。つまり、(例:SELECTUPDATE)クエリの実行にかかる時間。を超えるとSqlCommand.CommandTimeout、実行を停止します。コマンドタイムアウトエラーが発生します。

SqlConnection.ConnectionTimeout=接続のタイムアウト制限。つまり、接続オブジェクトが接続を試行できる時間。指定時間を超えると接続を停止します。接続タイムアウトエラーが発生します。


11

ConnectionTimeoutしようとすると、タイムアウトまでの待機期間を指定開きますSqlConnectionConnection.Open()コマンドに関連しています。

一方

SqlCommand.CommandTimeoutSqlCommandがタイムアウトするまで待機する期間を指定しました。これは、接続が開かExecuteXXXれ、コマンドオブジェクトでメソッドの1つが呼び出された後に発生します。


8

追加情報

デフォルト値CommandTimeoutは30秒です。ゼロ(0)は制限がないことを示します。CommandTimeout値はコーディングでのみ設定できます。

デフォルト値ConnectiontTimeoutは15秒です。Zero(0)は、制限がないことも示します。ゼロ未満の値(マイナス値)はを取得しArgumentExceptionます。あなたは、設定することができConnectionTimeout、両方のコーディングと設定ファイルの値を。


0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms

2
これは3番目のタイプのタイムアウトです。トピックの所有者が尋ねる2つのうちの1つではありません。そして、質問に答えません。編集する前に何が質問だったのかわからないので、-1にしません。
csaba Toth 2013

0

CommandTimeoutはConnectionオブジェクトとCommandオブジェクトの両方のプロパティであるため、クイックノート...

ConnectionオブジェクトのCommandTimeout設定は、同じConnectionのCommandオブジェクトのCommandTimeout設定には影響しません。つまり、CommandオブジェクトのCommandTimeoutプロパティは、ConnectionオブジェクトのCommandTimeout値の値を継承しません。

したがって、ConnectionオブジェクトのCommandTimeout設定は、Connectionオブジェクトでのみ実行されるコマンドにのみ影響します(Commandオブジェクトは使用しません)。

たとえば、ストアドプロシージャに接続してコマンドオブジェクトにパラメータを追加し、接続オブジェクトの接続を使用してコマンドオブジェクトを実行する場合は、コマンドオブジェクトにCommandTimeoutを設定し、接続オブジェクトにConnectionTimeoutを設定して両方をオーバーライドする必要がありますデフォルト。接続オブジェクトにCommandTimeoutを設定しても、コマンドオブジェクトコマンドのデフォルトのタイムアウトは上書きされません。

https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15 https://docs.microsoft.com/en-us / sql / ado / reference / ado-api / connectiontimeout-property-ado?view = sql-server-ver15

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.