У меня есть хранимая процедура T-SQL с подписью
CREATE PROCEDURE MyProc
@recordCount INT OUTPUT
@param1 INT
...
При выполнении непосредственно на сервере Sql процедура выполняется менее чем за 5 секунд, возвращая несколько наборов результатов, составляющих в общей сложности около 100 строк.
Вызов этой процедуры с использованием метода ADO.NET SqlDataAdapter.Fill
для заполнения Dataset
вызывает SqlTimeoutException
на SqlCommand
через 3 минуты (указанный интервал времени ожидания).
Изменение хранимой процедуры так, чтобы она больше не имела выходного параметра, и что требуемое выходное значение возвращается как последний набор результатов, решает проблему, и все это работает менее чем за 5 секунд, как ожидалось.
Но почему?
Я не хочу проходить свою базу кода и изменять все экземпляры такого типа поведения, не понимая, действительно ли я решил проблему.
Еще одно замечание: это очевидно только на одном конкретном сервере, который, по общему признанию, имеет больший набор данных, чем другие аналогичные базы данных, которые мы запускаем. Наверняка не параметр сервера Sql?
UPDATE
Попадая в исходный код, проблема, похоже, находится в поиске метаданных. Метод ConsumeMetaData
объекта SqlDataReader
висит бесконечно. Однако я запускал тесты в других базах данных и не могу воспроизвести, поэтому это проблема с базой данных, когда эта процедура вызывается, хотя ADO.NET... Отлично.
ОБНОВЛЕНИЕ II
Подтвердили, что проблема все же возникает, если я изменяю код для использования OleDbDataAdapter
с типами SQLOLEDB или SQLNCLI. Определенно делать с соединением.