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