Тайм-аут SQL запланированной задачи, но не при запуске вручную - PullRequest
0 голосов
/ 12 ноября 2018

У меня проблема с запуском консольного приложения C # через запланированное задание. Запланированное задание вызывает скрипт Powershell, который устанавливает некоторые переменные (например, строку подключения), и вызывает консольное приложение C #, которое подключается к базе данных с этими аргументами.

Проблема в том, что когда запланированное задание запускается триггером времени, в журналах я вижу, что приложение запускается как обычно, пытается выполнить запрос, но завершается неудачно с таймаутом SQl.

Запуск приложения вручную из окна «Запланированные задачи» (щелчок правой кнопкой мыши> «Выполнить») работает нормально, даже через несколько секунд после сбоя при автоматическом запуске. Это поведение настолько согласованно (сработало при сбое, запускается вручную), что я не думаю, что это база данных.

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

В чем может быть причина такого поведения и как я могу это исправить?

Некоторые настройки задачи:

  • Запуск с самыми высокими привилегиями: ON
  • Запуск независимо от того, вошел ли пользователь в систему или нет
  • Не хранить пароль: OFF
  • Учетная запись пользователя совпадает с зарегистрированным пользователем
  • Триггер не остановлен при продолжительной работе
  • Корректная папка запуска и расположение скрипта (приложение запускается и регистрируется, просто происходит сбой при доступе к базе данных. Ручной щелчок правой кнопкой мыши> Выполнить работает всегда)

трассировка стека ошибок:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TrySetMetaData(_SqlMetaDataSet metaData, Boolean moreInfo)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 ноября 2018

Я уверен, что помню ту же проблему с истечением времени ожидания при попытке получить данные таблицы META.

Я вполне могу ошибаться, но если я правильно помню, это было связано с ошибкой определения типа столбца при попытке анализа даты в неправильном (или неожиданном формате). Я смутно помню, что это связано с несоответствием между региональными настройками операционной системы, текущими региональными настройками пользователя и настройкой языка SQL Server.

Должен ли ваш запрос возвращать поля даты?

Я думаю, что это было решено путем обеспечения того, чтобы, как только база данных была подключена, был выполнен следующий запрос, чтобы заставить соединение БД использовать даты в формате ISO:

        using (SqlCommand sql = new SqlCommand("SET DATEFORMAT YMD", _conn))
        {
            sql.ExecuteNonQuery();
        }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...