Qual é a diferença entre SqlCommand.CommandTimeout e SqlConnection.ConnectionTimeout?

88

Existe alguma diferença entre SqlCommand.CommandTimeoute SqlConnection.ConnectionTimeoutno .NET?

Dhanapal
fonte
isso é específico para o MS SQL Server?
ympostor

Respostas:

129

Sim. CommandTimeouté quanto tempo um único comando pode levar para ser concluído. ConnectionTimeouté quanto tempo pode levar para estabelecer uma conexão com o servidor para começar.

Por exemplo, você pode estar executando consultas de execução relativamente longa - é perfeitamente normal que levem 10 minutos para serem concluídas, mas se demorasse 10 minutos para fazer a conexão para começar, você saberia que algo estava muito errado.

Jon Skeet
fonte
5
Para fins de argumentação, digamos que eu tenha um! ** & # Q @? consulta que leva 32 segundos para ser executada. Se eu definir SqlCommand.CommandTimeout = 40, mas deixar SqlConnection.ConnectionTimeout em seu padrão (presumivelmente 30), o tempo limite de conexão será atingido? Em outras palavras, preciso definir as duas propriedades? Parece que você está dizendo "não", mas devo ter esquecido da propriedade SqlConnection.ConnectionTimeout e comecei a questionar se a configuração de CommandTimeout faz tudo o que preciso.
flipdoubt
29
flipdoubt - o CommandTimeout afetará a consulta, o ConnectionTimout não. O ConnectionTimout não é um tempo limite para a conexão para realizar consultas - é apenas o tempo limite para a conexão se conectar ao banco de dados em primeiro lugar.
Robin Bennett
1
@JonSkeet do CommandTimeout e ConnectionTimeout, ambos geram a mesma exceção comum? Ou diferentes exceções?
Yasser Shaikh
1
@Yasser: Não sei, estou com medo.
Jon Skeet
6
Lembre-se de que CommandTimeout parece aplicar-se apenas até o ponto em que a primeira linha é retornada do SQL Server para o código do cliente. Por exemplo, se você tiver uma consulta que retorna a primeira linha em 30 segundos, mas o conjunto de linhas completo leva horas para retornar, definir o tempo limite para 30 segundos não irá expirar a consulta e a consulta será executada por horas. Esse é o caso principalmente se você não tiver operadores de bloqueio (como um pedido por) no LHS de seu plano de execução. (Postando porque passei 2 dias depurando isso e nenhuma outra referência sobre o assunto)
Dave
28

SqlCommand.CommandTimeout= limite de tempo para sua consulta SQL. Meios, quanto tempo um (por exemplo: SELECT, UPDATE) consulta pode demorar para sua execução. Se exceder SqlCommand.CommandTimeout, interrompe a execução. Ocorrerá um erro de tempo limite do comando.

SqlConnection.ConnectionTimeout= limite de tempo limite para sua conexão. Significa quanto tempo seu objeto de conexão pode tentar se conectar. Se exceder o tempo especificado, ele para de conectar. Ocorrerá um erro de tempo limite de conexão.

NinethSense
fonte
11

ConnectionTimeoutespecifica a duração de espera antes do tempo limite ao tentar abrir um SqlConnection. É relevante para o Connection.Open()comando.

enquanto

SqlCommand.CommandTimeoutespecificou a duração de um SqlCommand para aguardar antes de atingir o tempo limite. Isso acontece depois que uma conexão é aberta e um dos ExecuteXXXmétodos é chamado no objeto Command.

Cerebrus
fonte
8

Informação adicional

O valor padrão CommandTimeouté 30 segundos. Zero (0) indica que não há limite. Você pode definir o CommandTimeoutvalor apenas na codificação.

O valor padrão ConnectiontTimeouté 15 segundos. Zero (0) indica que não há limite também. Será obtido um valor menor que zero (valor negativo) ArgumentException. Você pode definir o ConnectionTimeoutvalor no arquivo de codificação e configuração.

Htin Aung
fonte
0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms
dodng
fonte
2
Este é um terceiro tipo de tempo limite. Nenhum dos dois sobre os quais o proprietário do tópico pergunta. E não responde à pergunta. Não vou -1, porque não sei qual era a dúvida antes das edições.
Csaba Toth
0

Nota rápida sobre CommandTimeout, uma vez que é uma propriedade dos objetos Connection e Command ...

A configuração CommandTimeout em um objeto Connection não tem efeito na configuração CommandTimeout em um objeto Command na mesma Connection; ou seja, a propriedade CommandTimeout do objeto Command não herda o valor do valor CommandTimeout do objeto Connection.

Portanto, a configuração CommandTimeout em um objeto Connection afeta apenas os comandos executados no objeto Connection (sem usar um objeto Command).

Por exemplo, quando você está se conectando a um Stored Proc e adicionando parâmetros ao objeto de comando e executando o objeto Command usando uma conexão do objeto Connection, então você precisa definir CommandTimeout no objeto Command e ConnectionTimeout no objeto Connection para substituir ambos padrões. Definir o CommandTimeout no objeto de conexão não substituirá o tempo limite padrão para os comandos do objeto de 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

Brad Skidmore
fonte