CommandTimeout не работает

Я пытаюсь изменить таймаут для запроса SqlCommand в методе, который проверяет мое соединение для данной строки соединения. Код аналогичен этому:

using (SqlConnection connection = new SqlConnection(connectionString))
    {
      SqlCommand cmd = new SqlCommand("SELECT ...", connection);
      cmd.CommandTimeout = 10;
      connection.Open();
      SqlDataReader reader = cmd.ExecuteReader();
      ...
      connection.Close();
    }

Я хотел бы иметь короткий тайм-аут здесь, так как я просто хочу проверить, нормально ли эта строка подключения. Но независимо от того, какое число я установил в CommandTimeout (я пробовал 0, 1, 2, 4, 10, 30, 60, 120), мое реальное время, полученное для фиктивной строки соединения, всегда примерно одинаковое (общее время работы около 15 секунд).

Итак, мне кажется, что значение, которое я установил в CommandTimeout, по какой-то причине игнорируется.

Любые идеи, почему?

Ответ 1

Я думаю, вы сбиваете с толку, для чего именно SqlCommand.CommandTimeout. По эта ссылка для MSDN:

Возвращает или задает время ожидания перед завершением попытки выполнить команду и генерации ошибки.

В вашем случае вы выполняете DataReader и выполняете свой запрос (каким бы он ни был). Для каждого Read() требуется минимальное время, поэтому вы не нажмете на свой тайм-аут.

Edit

Если вы используете неправильную строку соединения, ваш Timeout не будет таймаутом команды, но это будет время соединения. По умолчанию это значение составляет 15 секунд. Это тайм-аут, который эффективен в вашей ситуации.

Вы перейдете к вызову метода SqlConnection.Open(), а не SqlCommand.ExecuteReader(). Поэтому свойство ConnectionTimeout будет эффективным значением таймаута.

Свойство SqlConnection.ConnectionTimeout Ссылка на MSDN

Ответ 2

Вам также необходимо проверить тайм-аут соединения, значение которого по умолчанию составляет 15 секунд.

Также смотрите http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx - если ваша строка подключения имеет контекст, тогда CommandTimeout игнорируется

Ответ 4

Вы также можете указать это в строке подключения в файле конфигурации:

<connectionStrings>
  <add name="*con_name*" connectionString="data source=*dsource*;initial catalog=*catalog*;integrated security=True;Connect Timeout=300;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>