2009-08-30 5 views
24

Я использую VSTS 2008 + ADO.Net + C# + .Net 3.5 + SQL Server 2008. Я использую ADO.Net на стороне клиента для подключения к серверу базы данных для выполнения процедуры хранения, а затем возврата результат из процедуры магазина.Настройка таймаута для SQL Server

Вот мой код. У меня есть два вопроса о тайм-аут,

  1. Если я явно не устанавливать какие-либо параметры времени ожидания, связанные, для подключения к серверу баз данных, есть какие-либо параметры тайм-аута (например, если не удается подключиться к серверу базы данных для некоторого количества по умолчанию времени, будет какое-то исключение тайм-аута?)?

  2. Если я не устанавливаю явные настройки тайм-аута для выполнения процедуры хранилища, существуют ли какие-либо настройки таймаута (например, если невозможно получить результаты от сервера к клиенту ADO.Net за некоторое время по умолчанию, будет какое-то исключение тайм-аута?)?

    using (SqlConnection currentConnection = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Trusted_Connection=true;Asynchronous Processing=true")) 
        { 
         // check current batch conut 
         currentConnection.Open(); 
         using (SqlCommand RetrieveOrderCommand = new SqlCommand()) 
         { 
          RetrieveOrderCommand.Connection = currentConnection; 
          RetrieveOrderCommand.CommandType = CommandType.StoredProcedure; 
          RetrieveOrderCommand.CommandText = "prc_GetOrders"; 
          RetrieveBatchCountCommand.Parameters.Add("@Count", SqlDbType.Int).Direction = ParameterDirection.Output; 
          RetrieveBatchCountCommand.ExecuteNonQuery(); 
          int rowCount = Convert.ToInt32(RetrieveOrderCommand.Parameters["@Count"].Value); 
         } 
        } 
    

ответ

13

Да, есть 2 вида тайм-аут, который может быть установлен

  1. Connection timeout
  2. Command timeout

Оба по умолчанию 30 секунд в VBA, .net и т.д.

+0

Th anks gbn!Какие виды исключений будут выбрасываться или, другими словами, какие исключения мы должны поймать в нашем коде для обработки тайм-аута? – George2

+2

В SSMS я получаю «Истекло время ожидания». Период ожидания истекает до завершения операции или сервер не отвечает ». Вы можете протестировать с помощью WAITFOR DELAY '00: 00: 40 'для принудительного 40-секундного ожидания и исключения для таймаута команды. Для таймаута соединения вы можете составить имя сервера и попытаться подключиться. – gbn

+0

Спасибо, за тайм-аут команды, какие исключения следует поймать? – George2

40

Как ГБН уже упоминалось, существует два типа таймаутов:

1) Время ожидания соединения: это контролируется вашей строки соединения:

Data Source=.;Initial Catalog=TestDB; 
    Trusted_Connection=true;Asynchronous Processing=true 

Если добавить Connect Timeout=120 в эту строку, ваше соединение будет пытаться на 120 секунд, чтобы открыть, а затем прервать.

Data Source=.;Initial Catalog=TestDB; 
    Trusted_Connection=true;Asynchronous Processing=true; 
    Connect Timeout=120; 

2) Команда тайм-аут: для каждой команды, вы можете также указать тайм-аут - ADO.NET будет ждать, что количество времени, прежде чем отменить свой запрос. Необходимо указать, что на SqlCommand объекта:

using (SqlCommand RetrieveOrderCommand = new SqlCommand()) 
    { 
     RetrieveOrderCommand.CommandTimeout = 150; 
    } 
+9

Можно также отметить, что параметр «Время ожидания соединения» в строке соединения также контролирует тайм-аут для метода SqlTransaction.Commit –

+0

Спасибо Marc, какие исключения будут выбрасываться или, другими словами, какие исключения мы должны поймать в нашем коде для решения проблемы с тайм-аутом? – George2

+0

Спасибо, Филипп, вы имеете в виду, кроме тайм-аута соединения и тайм-аута команды, существует 3-й тип тайм-аута, называемый тайм-аутом транзакции? – George2

0

В классе SqlConnection есть свойство по имени «ConnectionTimeout» .Это не может быть непосредственно использован для установки требуемого значения тайм-аута соединения, как это только для чтения т.е. только «получить» реализуется & «set» в этом свойстве не реализован. Поэтому нам нужно использовать ключевое слово «Time Time» в самой строке соединения &, чтобы установить желаемое значение.

EXI: "Источник данных = (локальная); Initial Catalog = AdventureWorks; Integrated Security = SSPI; Connection Timeout = 30"; (30 означает 30 секунд)

30 секунд максимальное время, отведенное для установления подключение к серверу (например, 172.160.0.2 или что-то вроде ADMINISTRATOR \ SQLEXPRESS). Если он не смог сразу установить соединение с сервером, то он попытается выполнить до 30 секунд. Если сервер действителен & может подключиться к серверу &, если имя базы данных или учетные данные для входа недействительны, то этот таймаут не применим. Он немедленно выдает исключение для недопустимых имен или базы данных

Смежные вопросы