Qual è la differenza tra SqlCommand.CommandTimeout e SqlConnection.ConnectionTimeout?


Risposte:


129

Sì. CommandTimeoutè il tempo necessario per completare un singolo comando. ConnectionTimeoutè il tempo necessario per stabilire una connessione al server con cui iniziare.

Ad esempio, potresti eseguire query a esecuzione relativamente lunga: è perfettamente normale che impieghino 10 minuti per il completamento, ma se sono necessari 10 minuti per stabilire la connessione per iniziare, sapresti che qualcosa non va.


5
Per amor di discussione, diciamo che ho un! ** & # Q @? query che impiega 32 secondi per essere eseguita. Se imposto SqlCommand.CommandTimeout = 40 ma lascio SqlConnection.ConnectionTimeout al suo valore predefinito (presumibilmente 30), il timeout della connessione? In altre parole, devo impostare entrambe le proprietà? Sembra che tu stia dicendo "no", ma devo essermi dimenticato della proprietà SqlConnection.ConnectionTimeout e ho iniziato a chiedermi se l'impostazione di CommandTimeout fa tutto ciò di cui ho bisogno.
flipdoubt

29
flipdoubt - CommandTimeout influenzerà la query, ConnectionTimout no. ConnectionTimout non è un timeout per la connessione per eseguire le query, è solo il timeout per la connessione per connettersi al database in primo luogo.
Robin Bennett,

1
@ JonSkeet fanno CommandTimeout e ConnectionTimeout, entrambi generano la stessa eccezione comune? O diverse eccezioni?
Yasser Shaikh

1
@ Yasser: non lo so, ho paura.
Jon Skeet

6
Tieni presente che CommandTimeout sembra applicarsi solo fino al punto in cui la prima riga viene restituita da SQL Server al codice client. Ad esempio, se si dispone di una query che restituisce la prima riga entro 30 secondi, ma la restituzione dell'intero set di righe richiede ore, l'impostazione del timeout su 30 secondi non determinerà il timeout della query e la query verrà eseguita per ore. Questo è principalmente il caso se non hai operatori di blocco (come un Order by) sul LHS del tuo piano di esecuzione. (Pubblicazione perché ho passato 2 giorni a eseguire il debug di questo e nessun altro riferimento sull'argomento)
Dave

28

SqlCommand.CommandTimeout= limite di timeout per la tua query SQL. Mezzi, quanto tempo un (es: SELECT, UPDATE) interrogazione possono prendere per la sua esecuzione. Se supera SqlCommand.CommandTimeout, interrompe l'esecuzione. Si verificherà un errore di timeout del comando.

SqlConnection.ConnectionTimeout= limite di timeout per la connessione. Significa quanto tempo il tuo oggetto di connessione può provare a connettersi. Se supera il tempo specificato, interrompe la connessione. Si verificherà un errore di timeout della connessione.


11

ConnectionTimeoutspecifica la durata di attesa prima del timeout quando si tenta di aprire un file SqlConnection. È rilevante per ilConnection.Open() comando.

mentre

SqlCommand.CommandTimeoutha specificato la durata di attesa di un SqlCommand prima del timeout. Ciò accade dopo che una connessione è stata aperta e uno dei ExecuteXXXmetodi è stato chiamato sull'oggetto Command.


8

Informazioni addizionali

Il valore predefinito di CommandTimeoutè 30 secondi. Zero (0) indica nessun limite. Puoi impostareCommandTimeout valore solo in Codifica.

Il valore predefinito di ConnectiontTimeoutè 15 secondi. Zero (0) indica anche nessun limite. Otterrà un valore inferiore a zero (valore negativo) ArgumentException. È possibile impostare il ConnectionTimeoutvalore sia nel file Coding che nel file Config.


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

2
Questo è un terzo tipo di timeout. Nessuno dei due di cui chiede il proprietario dell'argomento. E non risponde alla domanda. Non lo farò -1, perché non so quale fosse la domanda prima delle modifiche.
Csaba Toth

0

Nota rapida su CommandTimeout, poiché è una proprietà sia degli oggetti Connection che degli oggetti Command ...

L'impostazione CommandTimeout su un oggetto Connection non ha effetto sull'impostazione CommandTimeout su un oggetto Command sulla stessa connessione; in altre parole, la proprietà CommandTimeout dell'oggetto Command non eredita il valore del valore CommandTimeout dell'oggetto Connection.

Quindi l'impostazione CommandTimeout su un oggetto Connection influisce solo sui comandi eseguiti sotto l'oggetto Connection (senza utilizzare un oggetto Command).

Ad esempio, quando ti connetti a uno Stored Proc e aggiungi parametri all'oggetto comando, ed esegui l'oggetto Command utilizzando la connessione di un oggetto di connessione, dovrai impostare CommandTimeout sull'oggetto Command e ConnectionTimeout sull'oggetto Connection per sovrascrivere entrambi impostazioni predefinite. L'impostazione del CommandTimeout sull'oggetto di connessione non sovrascriverà il timeout predefinito per i comandi dell'oggetto di comando.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.