我有一个问题,我必须通过计划任务运行C#控制台应用程序。计划好的任务调用Powershell脚本,该脚本设置一些变量(如连接字符串),并调用C#控制台应用程序,该应用程序使用这些参数连接到数据库。
问题是,当计划的任务由时间触发器触发时,我从日志中看到应用程序正常启动,尝试执行查询,但失败,但出现SQl超时。
从“计划任务”窗口手动运行应用程序(右键单击>“运行”)可以正常运行,即使在自动运行失败后几秒钟。这种行为是如此一致(触发失败,手动运行),以至于我认为它不是数据库。
它也不是启动目录,用户权限或参数中的差异,应用程序正在启动,只是数据库访问失败。
这种行为可能是什么原因,我该如何解决?
任务的某些设置:
错误的堆栈跟踪:
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
感谢您的帮助!
答案 0 :(得分:1)
我确信我记得尝试获取表META数据时发生超时同样的问题。
我在这里可能很错,但是如果我没记错的话,这是由于尝试以错误的(或意外的格式)解析日期导致的列类型检测失败。我对这与操作系统的“区域设置”,当前用户区域设置和“ SQL Server语言”设置之间的不匹配有一个模糊的回忆。
您的查询是否应返回任何日期字段?
我认为可以通过确保在连接数据库后立即执行以下查询来强制数据库连接使用ISO格式的日期来解决此问题:
using (SqlCommand sql = new SqlCommand("SET DATEFORMAT YMD", _conn))
{
sql.ExecuteNonQuery();
}
接下来,当您以交互方式运行任务时,它将连接到数据库,并且格式将处于您的活动区域设置中,但是当通过“计划任务”自动运行时,它将仅模拟您的用户,而不携带关联的区域设置,而是使用操作系统的设置。
答案 1 :(得分:0)
我知道这个问题的答案可以接受;但是,添加一点味道,可以通过正确设置任务计划程序轻松解决此问题。
如果您的操作系统是Win10,则在Task Scheduler --> General Tab --> Configure for -->
上选择“ Windows 10”。
在大多数情况下,可以轻松解决问题。