2015-02-27 3 views
1

Я устанавливаю CommandTimeout на 1 секунду, и исключение TimeoutException не генерируется, как ожидалось. Выполняемый мной запрос занимает около 7-8 секунд. Тайм-аут работает, однако, когда я использую ExecuteReader для выполнения запроса, а не для заполнения DataTable. Я попытался установить CommandTimeout, когда после создания команды, а также после создания DataAdapter.CommandTimeout не работает при использовании SqlDataAdapter для заполнения DataTable

using(SqlConnection con = new SqlConnection("data source=*****;user id==*****;password==*****;initial catalog==*****;")) 
{ 
    string query = "select * from *****"; 

    SqlCommand command = new SqlCommand(query, con); 
    //command.CommandTimeout = 1; 

    CostingDataSet cds = new CostingDataSet(); 

    SqlDataAdapter da = new SqlDataAdapter(command); 
    da.SelectCommand.CommandTimeout = 1; 

    Stopwatch stopwatch = Stopwatch.StartNew(); 
     da.Fill(cds.CostingData); 
    stopwatch.Stop(); 

    Console.WriteLine(stopwatch.ElapsedMilliseconds); 
} 

ответ

0

Запросы типа "select * from" являются плохими идеями.

What is the reason not to use select *?

Тем не менее, может быть, вы могли бы ОГРАНИЧЕНИЯМИ количество возвращаемых данных, по пейджинговой или аналогичным образом. Уменьшение количества возвращенных данных заставит его работать

+0

Котируемый код - это быстрый абстрактный проект VS, который я создал, чтобы изолировать проблему. – Ersl

+0

Кроме того, как уменьшить данные для решения проблемы? Моя проблема в том, что исключение тайм-аута НЕ выбрасывается. – Ersl

+0

@ Ersl Извините, я, хотя вы говорили о том, что исключение было брошено. – Oscar

0

Причина - это магия, возникающая в SQLDataAdapter, которая, откровенно говоря, является плохой идеей.

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

Мое предложение: убежать от адаптера и никогда не оглядываться назад. Они не так ценны и делают все более грязным.

Если это невозможно, установите время ожидания соединения в строке подключения и оно должно применяться независимо от способа доступа к базе данных.

+0

К сожалению, я не могу отойти от SQLDataAdapter в это время. Но я буду помнить об этом в будущем. Я попытался использовать ConnectionTimeout, но это не влияет на время выполнения команды. У меня также есть клиент, который страдает от удара по умолчанию в течение 5 минут. По какой-то причине кажется, что тайм-аут по умолчанию не перезаписывается. – Ersl

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