У чому різниця між SqlCommand.CommandTimeout і SqlConnection.ConnectionTimeout?


Відповіді:


127

Так. CommandTimeout- це скільки часу може виконати одна команда. ConnectionTimeout- це скільки часу може знадобитися для встановлення з'єднання з сервером для початку.

Наприклад, ви можете виконувати відносно давні запити - цілком нормально, щоб вони зайняли 10 хвилин, щоб виконати, але якщо для початку з’єднання знадобилося 10 хвилин, ви б знали, що щось було не так.


5
Задля аргументу припустимо, що я маю! ** & # Q @? запит, який триває 32 секунди. Якщо я встановлю SqlCommand.CommandTimeout = 40, але залишу SqlConnection.ConnectionTimeout за замовчуванням (імовірно 30), чи буде час очікування з'єднання? Іншими словами, чи потрібно встановлювати обидві властивості? Схоже, ви кажете "ні", але я, мабуть, забув про властивість SqlConnection.ConnectionTimeout і почав розпитувати, чи робить CommandTimeout все, що мені потрібно.
flipdoubt

29
flipdoubt - CommandTimeout вплине на запит, ConnectionTimout - ні. ConnectionTimout не є тайм-аутом для підключення до виконуваних запитів - це просто тайм-аут для з'єднання, перш за все для підключення до бази даних.
Робін Беннетт

1
@JonSkeet чи CommandTimeout і ConnectionTimeout, обидва генерують однаковий загальний виняток? Або різні винятки?
Ясер Шайх,

1
@ Ясер: Я не знаю, я боюся.
Джон Скіт,

6
Майте на увазі, що CommandTimeout, схоже, застосовується лише до моменту, коли перший рядок повертається із SQL Server до клієнтського коду. Наприклад, якщо у вас є запит, який повертає перший рядок протягом 30 секунд, але для повернення повного набору рядків потрібні години, встановлення часу очікування до 30 секунд не призведе до таймауту запиту, і запит буде виконуватися годинами. Це в основному так, якщо у вас немає операторів блокування (таких як Замовлення) на LHS вашого плану виконання. (Публікація, оскільки я витратив 2 дні на налагодження цього та жодної іншої довідки з цього приводу)
Дейв

28

SqlCommand.CommandTimeout= обмеження часу очікування для вашого запиту SQL. Значить, скільки часу (наприклад: SELECT, UPDATE) запит може прийняти для його виконання. Якщо він перевищує SqlCommand.CommandTimeout, то він зупиняє виконання. Помилка тайм-ауту команди.

SqlConnection.ConnectionTimeout= обмеження часу очікування для вашого з’єднання. Означає, скільки часу ваш об’єкт підключення може спробувати підключитися. Якщо він перевищує вказаний час, він припиняє підключення. Помилка очікування підключення.


11

ConnectionTimeoutвизначає тривалість очікування до закінчення часу очікування при спробі відкритиSqlConnection . Це стосується Connection.Open()команди.

поки

SqlCommand.CommandTimeoutвказано тривалість очікування командою SqlCommand до тайм-ауту. Це відбувається після того, як було відкрито з'єднання та ExecuteXXXвикликано один із методів для об'єкта Command.


8

Додаткова інформація

Значення за замовчуванням CommandTimeout- 30 секунд. Нуль (0) не означає обмеження. Ви можете встановити CommandTimeoutзначення лише в кодуванні.

Значення за замовчуванням ConnectiontTimeout- 15 секунд. Нуль (0) також не означає обмеження. Отримаємо менше нульового значення (мінус значення) ArgumentException. Ви можете встановити ConnectionTimeoutзначення як у кодуванні, так і у файлі конфігурації.


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

2
Це 3-й тип тайм-ауту. Не одне з двох, про яке запитує власник теми. І не відповідає на питання. Я не буду -1, бо я не знаю, про що було питання до редагувань.
Csaba Toth

0

Коротке зауваження щодо CommandTimeout, оскільки це властивість об'єктів Connection і Command ...

Параметр CommandTimeout для об’єкта Connection не впливає на параметр CommandTimeout для об’єкта Command на тому самому Connection; тобто властивість CommandTimeout об'єкта Command не успадковує значення CommandTimeout об'єкта Connection.

Отже, параметр CommandTimeout для об’єкта Connection впливає лише на команди, що виконуються лише під об’єктом Connection (без використання об’єкта Command).

наприклад, коли ви підключаєтеся до збереженого Proc і додаєте параметри до об'єкта команди та виконуєте об'єкт Command за допомогою з'єднання об'єкта підключення, тоді вам потрібно буде встановити CommandTimeout для об'єкта Command та ConnectionTimeout для об'єкта Connection, щоб замінити обидва за замовчуванням. Встановлення 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.