CommandTimeout игнорируется с помощью DbDataAdapter.Fill
Я не могу заставить CommandTimeout работать в коде ниже. Я установил значение тайм-аута на 1 секунду, чтобы проверить, работает ли он, но кажется, что он игнорируется. Оператор SELECT выполняется около 15 секунд и выполняется до завершения. Я ожидаю, что исключение тайм-аута произойдет через 1 секунду. Я искал в Интернете, чтобы найти пример того, как это сделать, и я не смог ничего найти. Что я делаю неправильно?
DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
DataSet dataSet = new DataSet();
DbCommand command = factory.CreateCommand();
command.Connection = factory.CreateConnection();
command.Connection.ConnectionString = "Server=localhost;Database=MyDatabase;User Id=;Password=****";
command.CommandType = CommandType.Text;
command.CommandText = "SELECT * FROM table";
command.CommandTimeout = 1;
using (DbDataAdapter adapter = factory.CreateDataAdapter())
{
adapter.SelectCommand = command;
adapter.Fill(dataSet);
}
ОБНОВЛЕНИЕ: я написал команду SELECT, выполнение которой занимает более 30 секунд. Это также не время ожидания. Я даже закомментировал свою строку CommandTimeout, и она все еще работала до конца. Таким образом, кажется, что даже стандартное CommandTimeout 30 секунд игнорируется. Я в тупике... любая помощь будет принята с благодарностью.
ОБНОВЛЕНИЕ: я думаю, что я мог понять это. Кажется, когда я написал действительно сложную инструкцию SELECT, произошло исключение тайм-аута команды. Я могу только догадываться, что происходит из-за того, что с моей простой командой SELECT выполнение команды занимает менее 1 секунды, но затем для загрузки набора данных требуется еще 15 секунд. Я на правильном пути здесь? Это кажется вероятным?
1 ответ
Тайм-аут команд - это совокупный тайм-аут (для всех сетевых пакетов, которые считываются во время вызова метода) для всех сетевых чтений во время выполнения команды или обработки результатов. Тайм-аут все еще может возникнуть после того, как возвращается первая строка, и он не включает время обработки пользователем, только время чтения по сети.
Например, с 30-секундным таймаутом, если для чтения требуются два сетевых пакета, у него есть 30 секунд для чтения обоих сетевых пакетов. Если вы снова вызовете Read, у него будет еще 30 секунд, чтобы прочитать все необходимые данные.
НОТА:
CommandTimeout не действует, когда команда выполняется для контекстного соединения (SqlConnection, открываемого с помощью "context connection=true" в строке соединения) или если оно используется во время асинхронных вызовов методов, таких как BeginExecuteReader.