计划任务SQL超时,但手动运行时不会超时



我遇到了一个问题,必须通过计划任务运行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

谢谢你的帮助!

我肯定记得在尝试获取表META数据时遇到过同样的超时问题。

我在这里可能大错特错,但如果我没有记错的话,这是由于试图解析错误(或意外格式(的日期导致的列类型检测失败。我模糊地记得这与操作系统区域设置、当前用户区域设置和SQL Server语言设置之间的不匹配有关。

您的查询是否应返回任何日期字段?

我认为这是通过确保数据库一连接,就执行以下查询来强制数据库连接使用ISO格式的日期来解决的:

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

因此,当您以交互方式运行任务时,它将连接到数据库,并且格式将在您的活动区域设置中,但是,当通过"计划任务"自动运行时,它只模拟您的用户,但不携带相关的区域设置,而是使用操作系统的区域设置。

我知道这个问题有一个公认的答案;然而,为了增加一点味道,这个问题可以通过正确设置任务调度程序来轻松解决。

如果您的操作系统是Win10,则在CCD_;Windows 10";。

在大多数情况下,这将很容易解决问题。

最新更新