Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计划任务SQL超时,但手动运行时不超时_Sql_Powershell_Scheduled Tasks - Fatal编程技术网

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

计划任务SQL超时,但手动运行时不超时,sql,powershell,scheduled-tasks,Sql,Powershell,Scheduled Tasks,我遇到了一个问题,即我必须通过计划任务运行C#控制台应用程序。计划任务调用Powershell脚本,该脚本设置一些变量(如连接字符串),并调用C#控制台应用程序,该应用程序使用这些参数连接到数据库 问题是,当定时任务由时间触发器触发时,我从日志中看到应用程序正常启动,试图执行查询,但由于SQl超时而失败 从计划任务窗口(右键单击>运行)手动运行应用程序可以正常工作,即使在自动运行时失败几秒钟后也可以。这种行为是如此一致(触发失败,手动运行),以至于我认为这不是数据库的问题 它也不是启动目录、用户

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

谢谢你的帮助

我肯定记得我在尝试获取表元数据时遇到了相同的超时问题

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

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

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

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

因此,当您以交互方式运行任务时,它将连接到数据库,并且格式将在您的活动区域设置中,但是当通过计划任务自动运行时,它仅模拟您的用户,而不携带关联的区域设置,我知道这个问题有一个公认的答案;然而,为了增加一点趣味,可以通过正确设置任务调度器轻松解决此问题

如果您的操作系统是Win10,则在
任务计划程序-->常规选项卡-->配置-->
上选择“Windows 10”


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

您的连接字符串是什么样子的?考虑使用服务器的IP地址进行测试(如果您还没有这么做)。我们使用cNeNess记录,而不是连接字符串中的实际IP。我可以按正常方式ping我在连接字符串中输入的服务器名称,它会按正常方式响应。conneciton字符串如下所示:Server=DBSERVER-NAME;数据库=数据库名称;uid=用户名;pwd=密码;PersistSecurityInfo=True;但是它(应该?)使用与触发时手动运行的连接字符串相同的连接字符串,那么这会有什么影响呢?但下一步我会试试实际的IP地址你的代码是什么样子的?PowerShell()有一个SQL模块-那里的命令
Invoke SqlCmd
有一个参数
QueryTimeout
@GuentherSchmitz,谢谢,我知道。我已经有了这个应用程序,它不仅仅是查询数据库或执行一些SQL。Powershell仅用作驱动程序,以使用正确的参数(其中一个参数是Powershell计算并提供给控制台应用程序的灵活日期)启动应用程序,这似乎是一种可能性,可以解释手动/自动任务的差异。实际上,应用程序查询数据库并返回日期字段。该表位于旧的遗留数据库中,因此可能会出现意外的格式。我会在接下来的几天里尝试这个,并报告说我们今天可以做一个新的版本,其中包含了您的更改,而且它似乎正在工作!这是一个多么晦涩的问题,但是谢谢你的帮助@CerylWiltink您认为您的遗留数据库中存在意外的格式吗?有没有办法识别他们?我也有类似的问题,但我不确定SQL Server中的
datetime
字段中是否有任何无效格式。我运行这个查询
从sys.syslanguages中选择dateformat,其中name=@@LANGUAGE
,得到
mdy
。我是否应该像答案中那样将其设置为
YMD
?你能分享你的想法吗?@Fer这个问题已经过去了很长时间,所以我恐怕记不清太多细节了。同时我也换了工作,所以我不能再查这个了。挖掘我的记忆;虽然这个答案似乎是一个解决方案,但我认为它实际上是一个与数据库无关的域控制器问题。我想这可能值得一试,看看是否有帮助。但是一个更好的步骤可能是在StackOverflow上打开一个新的问题,并对您的问题进行完整的描述,这样可能会得到更好的答案。祝你好运@谢谢你。如果我找不到解决方案,我将对我的问题进行更多分析,并提出一个新问题。