CommandTimeout не работает при использовании SqlDataAdapter для заполнения DataTable

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

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);
}

person Ersl    schedule 27.02.2015    source источник
comment
Connection.Open ()?   -  person Kiquenet    schedule 04.02.2021


Ответы (2)


Причина в волшебстве, которое происходит в SQLDataAdapter, и, честно говоря, почему они являются плохой идеей.

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

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

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

person Tim    schedule 27.02.2015
comment
К сожалению, в настоящее время я не могу отказаться от SQLDataAdapter. Но я буду иметь это в виду в будущем. Я пробовал использовать ConnectionTimeout, но это не повлияло на время выполнения команды. У меня также есть клиент, который страдает от превышения тайм-аута по умолчанию, равного 5 минутам. Таким образом, по какой-то причине кажется, что тайм-аут по умолчанию не перезаписывается. - person Ersl; 27.02.2015

Запросы типа «select * from» - плохая идея.

Какова причина не использовать select *?

Тем не менее, возможно, вы могли бы ограничить объем возвращаемых данных с помощью разбиения на страницы или аналогичным способом. Уменьшение количества возвращаемых данных заставит его работать

person Oscar    schedule 27.02.2015
comment
Цитируемый код взят из быстрого абстрактного проекта VS, который я создал, чтобы изолировать проблему. - person Ersl; 27.02.2015
comment
Кроме того, как сокращение объема данных решит проблему? Моя проблема в том, что исключение тайм-аута НЕ генерируется. - person Ersl; 27.02.2015
comment
@Ersl Извините, хотя вы говорили об исключении. - person Oscar; 27.02.2015