SQL Run EXE 工作.当 Exe 启动另一个 Exe 时挂起



我正在使用SQL Server Agent从SQL运行可执行文件。 也使用xp_cmdshell获得完全相同的结果。

可执行文件是用 C# 编写的。 最后一步是记录成功,以便我可以验证。

当可执行文件运行并且只执行内部进程(更新 SQL、从 Internet 获取数据(时,它会成功并更新 SQL,SQL Server 代理(作业(报告成功。 问题是当可执行程序运行另一个可执行文件时。

在Visual Studio的调试模式下,它可以工作并调用第二个程序,它完成其工作,然后第一个程序继续。 在部署中,它在调用第二个程序时挂起,并且永远不会完成。 如果我从程序 #1 中删除第二个程序调用,它就会成功。 一旦我添加对第二个程序的调用,它就会无限期挂起。

这是调用第二个程序的方法。

static void RunProgramImageUploadAwsS3(int itemId, string fileName = "", string folderName = "")
{
try
{
string programPath = @"\SVRVS ProjectsAWS_S3_Upload_ImageAWS_S3_Upload_Image.exe";
string programArgs = itemId.ToString() + ((fileName == "") ? "" : " " + fileName) + ((folderName == "") ? "" : " " + folderName);
using (Process exeProcess = Process.Start(programPath, programArgs))
{
exeProcess.WaitForExit();
}
}
catch (Exception e)
{
LogError("Method: RunProgramImageUploadAwsS3", e.Message.ToString());
}
}

我调用第二个程序的原因是它用于工作流程的其他部分。 我可以将其所有内容复制到程序 #1 中,但现在我有重复的程序部分,如果有任何更改都必须更改,等等。

我不知道从SQL调用第二个程序失败的原因,也无法在线找到任何详细信息。 它以这种方式流动得最好,因为我可以在程序 #2 上提供我正在使用的项目,因为程序 #1 正在处理它。

以下是 SQL xp_cmdshell代码:

declare @cmd varchar(500) = '"\SVRVS ProjectsItemDataItemData.exe"'
EXECUTE master..xp_cmdshell @cmd

根据您的评论,听起来您可以通过根据贾斯汀·坦纳(Justin Tanner(在此问题中的回答设置以下内容来修复它:

Process command = new Process();
command.EnableRaisingEvents = false;
command.StartInfo.UseShellExecute = false;
command.StartInfo.RedirectStandardOutput = true;

这可能对您有用,因为您现在根据 msdn 阻止它引发"退出"事件。重定向标准输出设置为 true 意味着您不再使用标准输出流(通常写入控制台(。因此,您已经抑制了它。UseShellExecute必须为假才能正常工作。有关更多信息,请参阅此处。

最新更新